ASP.NET MVC路由自定义:博客站点URL访问规则配置需求
搞定ASP.NET MVC Blog控制器的自定义路由配置
看起来你想要给博客网站配置两种友好的URL格式,分别对应Blog控制器的文章详情页和操作页面,我来帮你一步步实现这个需求:
1. 先调整控制器的路由属性(兼容原有设置)
你现在给Post方法加了[Route("post-blog")],这会让它响应/post-blog的请求。如果还想让它同时支持/blog/Post的访问方式,只需要给方法多添加一个Route属性就行,当然也可以保留原有的设置,看你的需求:
public class BlogController : Controller { // 处理 /blog/{blogtitle} 格式的请求,获取文章标题参数 public ActionResult Index(string title) { return View(); } // 同时支持 /post-blog 和 /blog/Post 的POST请求 [Route("post-blog")] [Route("blog/Post")] [HttpPost] public ActionResult Post(Blog blog, HttpPostedFileBase blogimage) { // 你的业务逻辑代码 return RedirectToAction("Index"); } // 同时支持 /post-blog 和 /blog/Post 的GET请求 [Route("post-blog")] [Route("blog/Post")] public ActionResult Post() { if (Request.Cookies["userInfo"] == null) { // 比如跳转到登录页的逻辑 return RedirectToAction("Login", "Account"); } return View(); } }
2. 在RouteConfig里配置全局路由规则
接下来要去App_Start/RouteConfig.cs里添加自定义路由,重点是要处理两种URL的优先级,避免冲突:
public class RouteConfig { public static void RegisterRoutes(RouteCollection routes) { routes.IgnoreRoute("{resource}.axd/{*pathInfo}"); // 必须启用属性路由,否则控制器上的[Route]注解不会生效 routes.MapMvcAttributeRoutes(); // 第一条路由:匹配 /blog/{blogtitle} → 对应Index方法 // 这里要注意优先级,必须放在/blog/{action}前面,不然会被误判为action routes.MapRoute( name: "BlogByTitle", url: "blog/{title}", defaults: new { controller = "Blog", action = "Index" }, // 添加正则约束:排除掉你控制器里已有的action名称(比如Post) // 如果以后加了Edit、Delete这类方法,也要加到排除列表里 constraints: new { title = @"^(?!Post$).*$" } ); // 第二条路由:匹配 /blog/{action} → 对应Blog控制器的其他动作 routes.MapRoute( name: "BlogActions", url: "blog/{action}", defaults: new { controller = "Blog", action = "Index" } ); // 保留默认的全局路由 routes.MapRoute( name: "Default", url: "{controller}/{action}/{id}", defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional } ); } }
3. 关键细节提醒
- 路由顺序很重要:一定要把
BlogByTitle路由放在BlogActions前面,因为路由是从上到下匹配的,如果先匹配到BlogActions,那像/blog/My-First-Post这种URL会被当成是调用名为My-First-Post的action,直接报错。 - 约束的作用:那个正则约束是用来避免冲突的——比如当用户访问
/blog/Post时,不会被匹配到BlogByTitle路由(把Post当成文章标题),而是正确路由到Post方法。 - 属性路由必须启用:
routes.MapMvcAttributeRoutes();这行代码不能忘,不然你控制器上的[Route]注解就白加了。
配置完之后,你就能实现:
www.sitename.com/blog/My-Amazing-Blog→ 自动路由到BlogController.Index方法,title参数就是"My-Amazing-Blog"www.sitename.com/blog/Post→ 正确访问BlogController的Post方法(不管是GET还是POST)www.sitename.com/post-blog→ 依然可以正常访问Post方法,兼容你原来的路由设置
内容的提问来源于stack exchange,提问作者TAHA SULTAN TEMURI
相关产品推荐
相关产品推荐

