ViewHelper.cs 30 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661
  1. using CZFW.Core.Security;
  2. using CZFW.Framework.Model;
  3. using CZFW.Framework.Tools;
  4. using CZFW.MDB;
  5. using CZFW.MDB.Logic;
  6. using CZFW.MDB.Model;
  7. using CZFW.MDB.Util;
  8. using Microsoft.AspNetCore.Html;
  9. using Microsoft.AspNetCore.Http;
  10. using Microsoft.AspNetCore.Mvc.Razor;
  11. using Microsoft.AspNetCore.Routing;
  12. using MongoDB.Bson;
  13. using Newtonsoft.Json.Linq;
  14. using System;
  15. using System.Collections.Generic;
  16. using System.Linq;
  17. using System.Text;
  18. using System.Text.RegularExpressions;
  19. using System.Threading.Tasks;
  20. using System.Web;
  21. namespace CZFW.CMS.Web.App_Code
  22. {
  23. public static class ViewHelper
  24. {
  25. /// <summary>
  26. /// 获取当前页的SEO及分享数据
  27. /// </summary>
  28. /// <param name="razorPage"></param>
  29. /// <returns></returns>
  30. public static SEOShareModel GetSEOShareModel(this RazorPage<dynamic> razorPage)
  31. {
  32. var site = SiteHelper.GetSiteModel(razorPage.Context);
  33. var res = new SEOShareModel();
  34. SimpleSysConfigModel sysConfig = SysConfig.GetSimpleProjectInfo(site.SiteName, site.TplName);
  35. if (razorPage.Model is JObject share) ///获取Model数据
  36. {
  37. var tp = share.SelectToken($"$.{Constants.SEOSHARE_SEO_PREFIX}.{Constants.SEO_TITLE}");
  38. res.SEOTitle = tp is null ? null : tp.ToString();
  39. tp = share.SelectToken($"$.{Constants.SEOSHARE_SEO_PREFIX}.{Constants.SEO_DESCRIPTION}");
  40. res.SEODescription = tp is null ? null : tp.ToString();
  41. tp = share.SelectToken($"$.{Constants.SEOSHARE_SEO_PREFIX}.{Constants.SEO_KEYWORDS}");
  42. res.SEOKeywords = tp is null ? null : tp.ToString();
  43. tp = share.SelectToken($"$.{Constants.SEOSHARE_SHARE_PREFIX}.{Constants.SHARE_DESCRIPTION}");
  44. res.ShareDescription = tp is null ? null : tp.ToString();
  45. tp = share.SelectToken($"$.{Constants.SEOSHARE_SHARE_PREFIX}.{Constants.SHARE_IMAGE}");
  46. res.ShareImage = tp is null ? null : tp.ToString();
  47. tp = share.SelectToken($"$.{Constants.SEOSHARE_SHARE_PREFIX}.{Constants.SHARE_TITLE}");
  48. res.ShareTitle = tp is null ? null : tp.ToString();
  49. tp = share.SelectToken($"$.{Constants.SEOSHARE_SHARE_PREFIX}.{Constants.SHARE_URL}");
  50. res.ShareUrl = tp is null ? null : tp.ToString();
  51. }
  52. ///获取ViewBag数据
  53. res.SEOTitle = string.IsNullOrWhiteSpace(res.SEOTitle) ? razorPage.ViewBag.seoTitle : res.SEOTitle;
  54. res.SEODescription = string.IsNullOrWhiteSpace(res.SEODescription) ? razorPage.ViewBag.seoDescription : res.SEODescription;
  55. res.SEOKeywords = string.IsNullOrWhiteSpace(res.SEOKeywords) ? razorPage.ViewBag.seoKeywords : res.SEOKeywords;
  56. res.ShareTitle = string.IsNullOrWhiteSpace(res.ShareTitle) ? razorPage.ViewBag.shareTitle : res.ShareTitle;
  57. res.ShareUrl = string.IsNullOrWhiteSpace(res.ShareUrl) ? razorPage.ViewBag.shareUrl : res.ShareUrl;
  58. res.ShareImage = string.IsNullOrWhiteSpace(res.ShareImage) ? razorPage.ViewBag.shareImage : res.ShareImage;
  59. res.ShareDescription = string.IsNullOrWhiteSpace(res.ShareDescription) ? razorPage.ViewBag.shareDescription : res.ShareDescription;
  60. string path = razorPage.Context.Request.Path;
  61. if (string.IsNullOrWhiteSpace(path))
  62. path = "/";
  63. string pathAndQuery = path + razorPage.Context.Request.QueryString;
  64. ///获取SEOSHare表中数据
  65. if (string.IsNullOrWhiteSpace(res.SEOTitle) && string.IsNullOrWhiteSpace(res.SEOKeywords) && string.IsNullOrWhiteSpace(res.SEODescription) &&
  66. string.IsNullOrWhiteSpace(res.ShareDescription) && string.IsNullOrWhiteSpace(res.ShareImage) &&
  67. string.IsNullOrWhiteSpace(res.ShareTitle) && string.IsNullOrWhiteSpace(res.ShareUrl))
  68. {
  69. MongoRepository mongoRepository = new MongoRepository();
  70. mongoRepository.SetCurrentTable($"{SiteHelper.GetSiteModel(razorPage.Context).TplName}_{Constants.SEOSHARE_TABLE_NAME}");
  71. var bson = mongoRepository.GetOne($"{{{Constants.SEO_URL}:'{pathAndQuery}'}}");
  72. if(bson==null)
  73. bson = mongoRepository.GetOne($"{{{Constants.SEO_URL}:'{path}'}}");
  74. if (bson != null)
  75. {
  76. bson.TryGetValue(Constants.SEOSHARE_SEO_PREFIX, out BsonValue seoBson);
  77. BsonValue tp;
  78. if (string.IsNullOrWhiteSpace(res.SEOTitle) && seoBson != null)
  79. res.SEOTitle = seoBson.AsBsonDocument.TryGetValue(Constants.SEO_TITLE, out tp) ? (tp is BsonString ? tp.AsString : null) : null;
  80. if (string.IsNullOrWhiteSpace(res.SEODescription) && seoBson != null)
  81. res.SEODescription = seoBson.AsBsonDocument.TryGetValue(Constants.SEO_DESCRIPTION, out tp) ? (tp is BsonString ? tp.AsString : null) : null;
  82. if (string.IsNullOrWhiteSpace(res.SEOKeywords) && seoBson != null)
  83. res.SEOKeywords = seoBson.AsBsonDocument.TryGetValue(Constants.SEO_KEYWORDS, out tp) ? (tp is BsonString ? tp.AsString : null) : null;
  84. bson.TryGetValue(Constants.SEOSHARE_SHARE_PREFIX, out BsonValue shareBson);
  85. res.ShareDescription = shareBson.AsBsonDocument.TryGetValue(Constants.SHARE_DESCRIPTION, out tp) ? (tp is BsonString ? tp.AsString : null) : null;
  86. if (string.IsNullOrWhiteSpace(res.ShareImage) && shareBson != null)
  87. res.ShareImage = shareBson.AsBsonDocument.TryGetValue(Constants.SHARE_IMAGE, out tp) ? (tp is BsonString ? tp.AsString : null) : null;
  88. if (string.IsNullOrWhiteSpace(res.ShareTitle) && shareBson != null)
  89. res.ShareTitle = shareBson.AsBsonDocument.TryGetValue(Constants.SHARE_TITLE, out tp) ? (tp is BsonString ? tp.AsString : null) : null;
  90. if (string.IsNullOrWhiteSpace(res.ShareUrl) && shareBson != null)
  91. res.ShareUrl = shareBson.AsBsonDocument.TryGetValue(Constants.SHARE_URL, out tp) ? (tp is BsonString ? tp.AsString : null) : null;
  92. }
  93. }
  94. ///获取默认数据
  95. if (string.IsNullOrWhiteSpace(res.SEOTitle))
  96. res.SEOTitle = sysConfig.ProjectName;
  97. if (string.IsNullOrWhiteSpace(res.SEOKeywords))
  98. res.SEOKeywords = sysConfig.ProjectName;
  99. if (string.IsNullOrWhiteSpace(res.SEODescription))
  100. if (!string.IsNullOrWhiteSpace(res.SEOTitle))
  101. res.SEODescription = res.SEOTitle;
  102. else
  103. res.SEODescription = sysConfig.ProjectName;
  104. if (string.IsNullOrWhiteSpace(res.ShareTitle))
  105. if (!string.IsNullOrWhiteSpace(res.SEOTitle))
  106. res.ShareTitle = res.SEOTitle;
  107. else
  108. res.ShareTitle = res.SEOTitle;
  109. if (string.IsNullOrWhiteSpace(res.ShareDescription))
  110. if (!string.IsNullOrWhiteSpace(res.SEOTitle))
  111. res.ShareDescription = res.SEOTitle;
  112. else
  113. res.ShareDescription = res.SEOTitle;
  114. if (string.IsNullOrWhiteSpace(res.ShareImage))
  115. res.ShareImage = sysConfig.Logo;
  116. if (string.IsNullOrWhiteSpace(res.ShareUrl))
  117. res.ShareUrl = sysConfig.SiteUrl + path;
  118. res.ShareImage = RelativeToAbsolutePath(res.ShareImage, razorPage.Context);
  119. return res;
  120. }
  121. //获取当前网站的系统配置数据
  122. public static dynamic GetSiteConfig(this RazorPage razorPage)
  123. {
  124. var site = SiteHelper.GetSiteModel(razorPage.Context);
  125. var data = SysConfig.SiteConfig(site.SiteName, site.TplName, site.ThemeName);
  126. return data;
  127. }
  128. /// <summary>
  129. /// 根据导航Id获取导航数据。
  130. /// </summary>
  131. /// <param name="razorPage"></param>
  132. /// <param name="navId"></param>
  133. /// <returns></returns>
  134. public static dynamic GetNavigation(this RazorPage razorPage, string navId)
  135. {
  136. var site = SiteHelper.GetSiteModel(razorPage.Context);
  137. var data = SiteNavigation.GetNavigation(site.SiteName, navId, site.TplName);
  138. return data;
  139. }
  140. //通过id获取单条数据
  141. public static dynamic Get(this RazorPage razorPage, string id, string pageName = null, string projection = "{}")
  142. {
  143. var pageLogic = CZHttpContext.ServiceProvider.GetService(typeof(IPage)) as IPage;
  144. var site = SiteHelper.GetSiteModel(razorPage.Context);
  145. if (string.IsNullOrWhiteSpace(pageName))
  146. pageName = GetPageName(razorPage);
  147. var bson = pageLogic.GetByName($"{site.TplName}_{pageName}", id, null, projection);
  148. if (bson == null)
  149. return null;
  150. else
  151. {
  152. var json = bson.CZToJson();
  153. dynamic jobject = JObject.Parse(json);
  154. return jobject;
  155. }
  156. }
  157. //通过id获取多条数据
  158. public static dynamic Gets(this RazorPage razorPage, string[] ids, string pageName = null, string projection = "{}")
  159. {
  160. var pageLogic = CZHttpContext.ServiceProvider.GetService(typeof(IPage)) as IPage;
  161. var site = SiteHelper.GetSiteModel(razorPage.Context);
  162. if (string.IsNullOrWhiteSpace(pageName))
  163. pageName = GetPageName(razorPage);
  164. var pages = new BsonArray();
  165. foreach (var id in ids)
  166. {
  167. var bson = pageLogic.GetByName($"{site.TplName}_{pageName}", id, null, projection);
  168. pages.Add(bson);
  169. }
  170. if (pages == null || pages.Count < 0)
  171. return null;
  172. else
  173. {
  174. var json = pages.CZToJson();
  175. dynamic jobject = JObject.Parse(json);
  176. return jobject;
  177. }
  178. }
  179. /// <summary>
  180. /// 按条件获取一条数据
  181. /// </summary>
  182. /// <param name="razorPage"></param>
  183. /// <param name="pageName">如果为空,则取当前页面的pageName</param>
  184. /// <param name="query"></param>
  185. /// <param name="projection"></param>
  186. /// <param name="sort"></param>
  187. /// <returns></returns>
  188. public static dynamic GetOne(this RazorPage razorPage, string pageName = null, string query = "{}", string projection = "{}", string sort = "{'sort_order':-1}")
  189. {
  190. var pageLogic = CZHttpContext.ServiceProvider.GetService(typeof(IPage)) as IPage;
  191. var site = SiteHelper.GetSiteModel(razorPage.Context);
  192. if (string.IsNullOrWhiteSpace(pageName))
  193. pageName = GetPageName(razorPage);
  194. query = AssureLangPara(query, site.ThemeName);
  195. var bson = pageLogic.GetOneByName(site.SiteName, $"{site.TplName}_{pageName}", query, projection, sort);
  196. if (bson == null)
  197. return null;
  198. else
  199. {
  200. var json = bson.CZToJson();
  201. dynamic jarray = JObject.Parse(json);
  202. return jarray;
  203. }
  204. }
  205. /// <summary>
  206. /// 获取下一条
  207. /// </summary>
  208. /// <param name="razorPage"></param>
  209. /// <param name="projection"></param>
  210. /// <param name="sort">默认按创建时间取</param>
  211. /// <returns></returns>
  212. public static dynamic GetNext(this RazorPage<dynamic> razorPage, string projection = "{_id:1, title:1, summary:1, image:1}", string sort = "{sort_order:-1,modify_time:-1}")
  213. {
  214. var model = razorPage.Model;
  215. var pageName = razorPage.Context.GetRouteValue("pageName").ToString();
  216. var sortOrder = model.sort_order;
  217. var query = $"{{sort_order:{{$lt:{sortOrder}}}}}";
  218. query = AssureLangPara(query, SiteHelper.GetSiteModel(razorPage.Context).ThemeName);
  219. return GetOne(razorPage: razorPage, pageName: pageName, query: query, projection: projection, sort: sort);
  220. }
  221. /// <summary>
  222. /// 获取上一条
  223. /// </summary>
  224. /// <param name="razorPage"></param>
  225. /// <param name="projection"></param>
  226. /// <param name="sort">默认按创建时间取</param>
  227. /// <returns></returns>
  228. public static dynamic GetPre(this RazorPage<dynamic> razorPage, string projection = "{_id:1, title:1, summary:1, image:1}", string sort = "{sort_order:1,modify_time:1}")
  229. {
  230. var model = razorPage.Model;
  231. var pageName = razorPage.Context.GetRouteValue("pageName").ToString();
  232. var query = $"{{sort_order:{{$gt:{model.sort_order}}}}}";
  233. query = AssureLangPara(query, SiteHelper.GetSiteModel(razorPage.Context).ThemeName);
  234. return GetOne(razorPage: razorPage, pageName: pageName, query: query, projection: projection, sort: sort);
  235. }
  236. /// <summary>
  237. /// 获取数据列表
  238. /// </summary>
  239. /// <param name="razorPage"></param>
  240. /// <param name="pageName">如果为空,则为当前页面的pageName</param>
  241. /// <param name="query"></param>
  242. /// <param name="type"></param>
  243. /// <param name="projection"></param>
  244. /// <param name="pageIndex"></param>
  245. /// <param name="pageSize"></param>
  246. /// <param name="sort"></param>
  247. /// <returns></returns>
  248. public static dynamic GetList(this RazorPage razorPage, string pageName = null, string query = "{}", string type = null, string projection = "{}", int pageIndex = 1, int pageSize = 12, string sort = "{'sort_order':-1}")
  249. {
  250. var pageLogic = CZHttpContext.ServiceProvider.GetService(typeof(IPage)) as IPage;
  251. var site = SiteHelper.GetSiteModel(razorPage.Context);
  252. if (string.IsNullOrWhiteSpace(pageName))
  253. pageName = GetPageName(razorPage);
  254. query = AssureLangPara(query, site.ThemeName);
  255. var bson = pageLogic.GetListByName(site.SiteName, $"{site.TplName}_{pageName}", type, query, projection, pageIndex, pageSize, sort);
  256. if (bson == null)
  257. return null;
  258. else
  259. {
  260. var json = bson.CZToJson();
  261. dynamic jarray = JArray.Parse(json);
  262. return jarray;
  263. }
  264. }
  265. /// <summary>
  266. /// 获取随机相关记录,通常在详情页的下方会有获取相关记录。获取的记录会根据查询结果随机取出,并且支持排除当前记录
  267. /// </summary>
  268. /// <param name="razorPage"></param>
  269. /// <param name="selfId">当前记录Id,避免数据少时将当前显示的数据给取出来</param>
  270. /// <param name="size">需要取的相关记录的条数</param>
  271. /// <param name="query">查询条件。</param>
  272. /// <param name="projection">需要取回的字段</param>
  273. /// <returns></returns>
  274. public static dynamic GetRelated(this RazorPage razorPage, object selfId = null, int size = 4, string query = "{}", string projection = "{}")
  275. {
  276. var pageLogic = CZHttpContext.ServiceProvider.GetService(typeof(IPage)) as IPage;
  277. var (siteName, tplName, tableName) = SiteInfo(razorPage);
  278. var self = selfId == null ? string.Empty : selfId.ToString();
  279. query = AssureLangPara(query, SiteHelper.GetSiteModel(razorPage.Context).ThemeName);
  280. var res = pageLogic.GetRelated(siteName, tableName, self, query, projection, size);
  281. dynamic re = JArray.Parse(res.CZToJson());
  282. return re;
  283. }
  284. ///获取条数
  285. public static int GetCount(this RazorPage razorPage, string query = "{}")
  286. {
  287. var pageLogic = CZHttpContext.ServiceProvider.GetService(typeof(IPage)) as IPage;
  288. var site = SiteHelper.GetSiteModel(razorPage.Context);
  289. var pageName = GetPageName(razorPage);
  290. query = AssureLangPara(query, site.ThemeName);
  291. var count = pageLogic.GetCount(site.SiteName, $"{site.TplName}_{pageName}", query);
  292. return (int)count;
  293. }
  294. public static int GetQryCount(this RazorPage razorPage, string pageName = null, string query = "{}")
  295. {
  296. var pageLogic = CZHttpContext.ServiceProvider.GetService(typeof(IPage)) as IPage;
  297. var site = SiteHelper.GetSiteModel(razorPage.Context);
  298. if (string.IsNullOrWhiteSpace(pageName))
  299. pageName = GetPageName(razorPage);
  300. query = AssureLangPara(query, site.ThemeName);
  301. var count = pageLogic.GetCount(site.SiteName, $"{site.TplName}_{pageName}", query);
  302. return (int)count;
  303. }
  304. //获取分页对象。
  305. public static PagerModel GetPager(this RazorPage razorPage)
  306. {
  307. int pageIndex = 1, pageSize = 12;
  308. int total = razorPage.ViewBag.total;
  309. var query = razorPage.Context.Request.Query;
  310. if (query.ContainsKey(CMSWebConstant.PAGE_INDEX_QUERY_STRING_KEY))
  311. {
  312. int.TryParse(query[CMSWebConstant.PAGE_INDEX_QUERY_STRING_KEY], out pageIndex);
  313. }
  314. if (query.ContainsKey(CMSWebConstant.PAGE_SIZE_QUERY_STRING_KEY))
  315. int.TryParse(query[CMSWebConstant.PAGE_SIZE_QUERY_STRING_KEY], out pageSize);
  316. var pager = new PagerModel(total, pageIndex, pageSize);
  317. return pager;
  318. }
  319. //替换当前页面url中的pageindex参数。主要用于配合生成分页列表。
  320. /// <param name="razorPage"></param>
  321. /// <param name="pageIndex">要替换的pageIndex值</param>
  322. /// <param name="absoluteUrl">是否生成绝对路径</param>
  323. /// <returns>更新pageIndex后的路径</returns>
  324. public static string ReplacePageIndex(this RazorPage razorPage, int pageIndex, bool absoluteUrl = false)
  325. {
  326. var url = razorPage.Context.Request.Path.ToString();
  327. var query = razorPage.Context.Request.Query;
  328. var querystring = $"?{CMSWebConstant.PAGE_INDEX_QUERY_STRING_KEY}={pageIndex}";
  329. foreach (var item in query)
  330. {
  331. if (item.Key != CMSWebConstant.PAGE_INDEX_QUERY_STRING_KEY)
  332. querystring += $"&{item.Key}={item.Value}";
  333. }
  334. url = url + querystring;
  335. if (absoluteUrl)
  336. {
  337. var request = razorPage.Context.Request;
  338. url = $"{request.Scheme}://{request.Host.Host}{url}";
  339. }
  340. return url;
  341. }
  342. //替换当前页面url中的pageSize参数。主要用于配合生成分页列表。
  343. /// <param name="razorPage"></param>
  344. /// <param name="pageIndex">要替换的pageSize值</param>
  345. /// <param name="absoluteUrl">是否生成绝对路径</param>
  346. /// <returns>更新pageIndex后的路径</returns>
  347. public static string ReplacePageSize(this RazorPage razorPage, int pageSize, bool absoluteUrl = false)
  348. {
  349. var url = razorPage.Context.Request.Path.ToString();
  350. var query = razorPage.Context.Request.Query;
  351. var querystring = $"?{CMSWebConstant.PAGE_SIZE_QUERY_STRING_KEY}={pageSize}";
  352. foreach (var item in query)
  353. {
  354. if (item.Key != CMSWebConstant.PAGE_SIZE_QUERY_STRING_KEY)
  355. querystring += $"&{item.Key}={item.Value}";
  356. }
  357. url = url + querystring;
  358. if (absoluteUrl)
  359. {
  360. var request = razorPage.Context.Request;
  361. url = $"{request.Scheme}://{request.Host.Host}{url}";
  362. }
  363. return url;
  364. }
  365. public static string ReplaceQueryString(string url, string key, string newVal)
  366. {
  367. var query = url;
  368. var reg = new Regex($"{key}=\\w*");
  369. var match = reg.Match(query);
  370. var newquery = $"{key}={newVal}";
  371. if (match.Success)
  372. {
  373. url = reg.Replace(query, newquery);
  374. }
  375. else
  376. {
  377. if (url.Contains("?"))
  378. url += $"&{newquery}";
  379. else
  380. url += $"?{newquery}";
  381. }
  382. return url;
  383. }
  384. /// <summary>
  385. /// 生成Url工具
  386. /// </summary>
  387. /// <param name="razorPage"></param>
  388. /// <param name="action">不填时为与当前页面的action一致。例如当前时List,则生成的url的action也为List</param>
  389. /// <param name="pageName">不填时与当前页面的pageName一致</param>
  390. /// <param name="id">Id参数,通常在生成详情页时使用。</param>
  391. /// <param name="query">查询字符串,需要将所有的查询字符串完整传入。且需要在传入前完成加密</param>
  392. /// <param name="absoluteUrl">是否生成绝对路径url</param>
  393. /// <returns></returns>
  394. public static string Url(this RazorPage razorPage,
  395. string action = null,
  396. string pageName = null,
  397. object id = null,
  398. string query = null,
  399. bool absoluteUrl = false)
  400. {
  401. string _id = null;
  402. if (id != null)
  403. _id = id.ToString();
  404. var route = razorPage.Context.GetRouteData();
  405. if (string.IsNullOrWhiteSpace(pageName))
  406. {
  407. pageName = route.Values["pageName"].ToString();
  408. }
  409. if (string.IsNullOrWhiteSpace(action))
  410. {
  411. action = route.Values["action"].ToString();
  412. }
  413. if (!string.IsNullOrWhiteSpace(_id) && route.Values.ContainsKey("id"))
  414. {
  415. _id = route.Values["id"].ToString();
  416. }
  417. if (action.ToLower() == "list")
  418. action = null;
  419. else
  420. {
  421. if (action.ToLower() == "detail")
  422. {
  423. action = $"/{action}";
  424. }
  425. else
  426. {
  427. action = $"/{action}.html";
  428. }
  429. }
  430. string lang = SiteHelper.GetSiteModel(razorPage.Context).ThemeName;
  431. if (lang != SysConfig.DefaultLanguage())
  432. lang = $"/{lang}";
  433. if (!string.IsNullOrWhiteSpace(_id))
  434. _id = $"/{_id}.html";
  435. var url = $"/{lang}/{pageName}{action}{_id}";
  436. if (!string.IsNullOrWhiteSpace(query))
  437. url = $"{url}?{query}";
  438. if (absoluteUrl)
  439. {
  440. var request = razorPage.Context.Request;
  441. url = $"{request.Scheme}://{request.Host.Host}{url}";
  442. }
  443. return url;
  444. }
  445. public static string UrlDetail(this RazorPage razorPage, object id, string pageName = null)
  446. {
  447. return Url(razorPage, "detail", id: id, pageName: pageName);
  448. }
  449. public static string UrlList(this RazorPage razorPage,
  450. string pageName = null,
  451. string qry = null,
  452. string type = null,
  453. string prj = null,
  454. string st = null,
  455. string view = null,
  456. int pageIndex = 0,
  457. int pageSize = 12,
  458. string otherQuery = null,
  459. int total = 0)
  460. {
  461. var query = string.Empty;
  462. if (!string.IsNullOrWhiteSpace(qry))
  463. query += $"qry={DesEncrypt.Encrypt(qry)}&";
  464. if (!string.IsNullOrWhiteSpace(prj))
  465. query += $"prj={DesEncrypt.Encrypt(prj)}&";
  466. if (!string.IsNullOrWhiteSpace(st))
  467. query += $"st={DesEncrypt.Encrypt(st)}&";
  468. if (!string.IsNullOrWhiteSpace(view))
  469. query += $"view={view}&";
  470. if (pageIndex > 0)
  471. query += $"pageIndex={pageIndex}&";
  472. if (pageSize > 0)
  473. query += $"pageSize={pageSize}&";
  474. if (total > 0)
  475. query += $"total={total}&";
  476. if (!string.IsNullOrWhiteSpace(otherQuery))
  477. query += otherQuery;
  478. if (query.EndsWith("&"))
  479. query.Remove(query.Length - 1);
  480. return Url(razorPage, "list", pageName, null, query);
  481. }
  482. /// <summary>
  483. /// 获取分类对象
  484. /// </summary>
  485. /// <param name="razorPage"></param>
  486. /// <param name="cateName">分类的cate_name,就是分类本身,也是分类对象的根节点的cate_name值。该值是在建模时填入的。</param>
  487. /// <param name="descendants">分类的路径。 当分类有多层时,从外到内,每一层的cate_name</param>
  488. /// <returns></returns>
  489. public static dynamic GetCategory(this RazorPage razorPage, object cateName, params object[] descendants)
  490. {
  491. var site = SiteHelper.GetSiteModel(razorPage.Context);
  492. var cate = CategoryRepository.GetCategory(site.SiteName, cateName.ToString(), site.TplName, site.ThemeName);
  493. BsonDocument res = null;
  494. if (cate == null) return null;
  495. if (descendants.Count() == 0)
  496. res = cate;
  497. else
  498. {
  499. if (!cate.Contains(Constants.CATEGORY_CHILDREN_FIELD))
  500. return null;
  501. var children = cate[Constants.CATEGORY_CHILDREN_FIELD].AsBsonArray;
  502. if (children.Count == 0)
  503. return null;
  504. foreach (var item1 in descendants)
  505. {
  506. var item = item1.ToString();
  507. res = GetCategoryChildByCateName(children, item);
  508. if (res == null)
  509. return null;
  510. if (res.Contains(Constants.CATEGORY_CHILDREN_FIELD) && res[Constants.CATEGORY_CHILDREN_FIELD].IsBsonArray)
  511. children = res[Constants.CATEGORY_CHILDREN_FIELD].AsBsonArray;
  512. else
  513. children = new BsonArray();
  514. }
  515. }
  516. dynamic obj = JObject.Parse(res.CZToJson());
  517. return obj;
  518. }
  519. /// <summary>
  520. /// 获取分类对象的名称。用法与GetCategory一致
  521. /// </summary>
  522. /// <param name="razorPage"></param>
  523. /// <param name="cateName"></param>
  524. /// <param name="descendants"></param>
  525. /// <returns></returns>
  526. public static string GetCateNameByStringIds(this RazorPage razorPage, object cateName, params object[] descendants)
  527. {
  528. var cate = GetCategory(razorPage, cateName.ToString(), descendants);
  529. if (cate == null)
  530. return null;
  531. return cate[Constants.CATEGORY_TITLE_FIELD];
  532. }
  533. /// <summary>
  534. /// 获取分类对象的名称。用法与GetCategory一致
  535. /// </summary>
  536. /// <param name="razorPage"></param>
  537. /// <param name="cateName"></param>
  538. /// <param name="descendants"></param>
  539. /// <returns></returns>
  540. public static string GetCateName(this RazorPage razorPage, object cateName, JArray descendants = null)
  541. {
  542. var items = new string[] { };
  543. if (descendants != null)
  544. items = descendants.ToObject<string[]>();
  545. var cate = GetCategory(razorPage, cateName.ToString(), items);
  546. if (cate == null)
  547. return null;
  548. return cate[Constants.CATEGORY_TITLE_FIELD];
  549. }
  550. /// <summary>
  551. /// 获取分类对象的名称。用法与GetCategory一致 by:cr
  552. /// </summary>
  553. /// <param name="razorPage"></param>
  554. /// <param name="cateName"></param>
  555. /// <param name="descendants"></param>
  556. /// <returns></returns>
  557. public static dynamic GetCate2(this RazorPage razorPage, object cateName, JArray descendants = null)
  558. {
  559. var items = new string[] { };
  560. if (descendants != null)
  561. items = descendants.ToObject<string[]>();
  562. var cate = GetCategory(razorPage, cateName.ToString(), items);
  563. if (cate == null)
  564. return null;
  565. return cate;
  566. }
  567. //从当前url的查询字符串中获取值
  568. public static string GetQueryString(this RazorPage razorPage, string key)
  569. {
  570. var query = razorPage.Context.Request.Query[key];
  571. return query;
  572. }
  573. static BsonDocument GetCategoryChildByCateName(BsonArray children, string cateName)
  574. {
  575. return children.SingleOrDefault(x => x.AsBsonDocument.Contains(Constants.CATEGORY_ID_FIELD) && x[Constants.CATEGORY_ID_FIELD].AsString == cateName)?.AsBsonDocument;
  576. }
  577. static string GetPageName(RazorPage razorPage)
  578. {
  579. return razorPage.Context.GetRouteValue("pageName").ToString();
  580. }
  581. static (string siteName, string tplName, string tableName) SiteInfo(RazorPage razorPage)
  582. {
  583. var site = SiteHelper.GetSiteModel(razorPage.Context);
  584. return (site.SiteName, site.TplName, $"{site.TplName}_{GetPageName(razorPage)}");
  585. }
  586. public static string AssureLangPara(string query, string lang)
  587. {
  588. var obj = JObject.Parse(query);
  589. if (!obj.ContainsKey(Constants.LANG_FIELD))
  590. obj[Constants.LANG_FIELD] = lang;
  591. return obj.ToString();
  592. }
  593. public static string RelativeToAbsolutePath(string path, HttpContext razorPage)
  594. {
  595. if (string.IsNullOrWhiteSpace(path))
  596. return null;
  597. var host = $"{razorPage.Request.Scheme}://{razorPage.Request.Host}";
  598. if (path.Contains(host))
  599. return path;
  600. if (!path.StartsWith("/"))
  601. path = $"/{path}";
  602. var res = $"{host}{path}";
  603. return res;
  604. }
  605. public static string UrlDecode(string uriComponent) {
  606. var res = HttpUtility.UrlDecode(uriComponent);
  607. return res;
  608. }
  609. }
  610. }