发布:2023/12/7 15:35:50作者:大数据 来源:大数据 浏览次数:718
为了搜索引擎友好,一般cms将以目录的形式设置成路由,这样对seo有利。如news/school、news/company等
一、新建一个类,并派生
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
public class CmsUrlConstraint : IRouteConstraint { public bool Match(HttpContextBase httpContext, Route route, string parameterName, RouteValueDictionary values, RouteDirection routeDirection) { var db = new MvcCMS.Models.MvcCMSContext(); if (values[parameterName] != null) { var permalink = values[parameterName].ToString(); var page = db.CMSPages.Where(p => p.Permalink == permalink).FirstOrDefault(); if(page != null) { HttpContext.Items["cmspage"] = page;//保存方便控制器直接使用,而不用重复查询 return true; } return false; } return false; } } |
二、注册路由
1 2 3 4 5 6 7 8 9 10 11 12 |
routes.MapRoute( name: "CmsRoute", url: "{*permalink}", defaults: new {controller = "Page", action = "Index"}, constraints: new { permalink = new CmsUrlConstraint() } ); routes.MapRoute( name: "Default", url: "{controller}/{action}/{id}", defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional } ); |
三、在控制器处理逻辑
1 2 3 4 5 |
public ActionResult Index(string permalink) { var page = HttpContext.Items["cmspage"] as CMSPage; //show the content with view } |
以上是asp.net mvc
.net core的话是下面的。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
public class CmsUrlConstraint : IRouteConstraint { public bool Match(HttpContext httpContext, IRouter route, string routeKey, RouteValueDictionary values, RouteDirection routeDirection) { var db = new List<string> { "abc/a", "abc/b" }; if (values[routeKey] != null) { var permalink = values[routeKey].ToString(); var page = db.Where(p => p == permalink).FirstOrDefault(); if (page != null) { httpContext.Items["cmspage"] = page; return true; } return false; } return false; } } |
参数名字有变动,控制器代码就此略过
https://stackoverflow.com/questions/16026441/dynamic-routes-from-database-for-asp-net-mvc-cms
© Copyright 2014 - 2025 柏港建站平台 ejk5.com. 渝ICP备16000791号-4