You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.26 11:01:18