【问题标题】:MVC4 Route as /{controler}-{id} instead of /{controler}/{id}MVC 4 路由为 /{controller}-{id} 而不是 /{controller}/{id}
【发布时间】:2013-03-14 01:04:57
【问题描述】:

在我的工作中,我必须解决一个 URL 重写问题。我必须使用 URL 作为模板:

{controller}/{action}-{id}

而不是

{controller}/{action}/{id}

所以处理后的 url 应该是这样的:

myController/myAction-128

其中 128 是一个参数

我的路线图:

public static void RegisterRoutes(RouteCollection routes)
        {
            routes.IgnoreRoute("{resource}.axd/{*pathInfo}");

            routes.MapRoute(
                name: "Default",
                url: "{controller}/{action}/{id}",
                defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional }
            );

            routes.MapRoute(
                name: "NewRoute", // Route name
                url: "{controller}/{action}-{id}/{extId}", // URL with parameters
                defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional, extId = UrlParameter.Optional } // Parameter defaults
            );
        }

控制器代码:

[HttpGet]
        public ActionResult DocumentDetails(int? id)
        {
            if (doc.HasValue)
            {
              ...
            }
        }

这条路线没有提供任何成功的结果。我仍然有 404 错误。当我使用 / 而不是“-”时,一切正常,但我的 JS View 环境无法正常工作。

我可以做些什么来解决这个问题吗?我们将不胜感激所有帮助,谢谢。

【问题讨论】:

    标签: c# asp.net-mvc asp.net-mvc-4 url-rewriting asp.net-mvc-routing


    【解决方案1】:

    路由的评估顺序与您定义它们的顺序相同,因此请确保遵守相同的顺序。还为id 添加一个约束(例如作为一个数字)将有助于路由引擎消除您的路由歧义。更不用说在您的示例中您已将 id 标记设为可选,这当然是不可能的,只有路线的最后一部分可以是可选的。

    所以:

    public static void RegisterRoutes(RouteCollection routes)
    {
        routes.IgnoreRoute("{resource}.axd/{*pathInfo}");
    
        routes.MapRoute(
            name: "NewRoute",
            url: "{controller}/{action}-{id}/{extId}",
            defaults: new { controller = "Home", action = "Index", extId = UrlParameter.Optional },
            new { id = @"\d+" }
        );
    
        routes.MapRoute(
            name: "Default",
            url: "{controller}/{action}/{id}",
            defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional }
        );
    }
    

    【讨论】:

    • 谢谢,此代码有效。顺便说一句:@"\d+" 是路由中数字的正则表达式吗?
    • 是的,\d+ 是匹配一个或多个数字的正则表达式。
    【解决方案2】:

    我认为您的请求正在由第一个路由规则处理,然后 action-id 被视为一个完整的操作并且未被找到。

    在默认路由之前设置您的 NewRoute。只需将代码向上移动。

    【讨论】:

    • 谢谢大家,更改订单有很大帮助;)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-06-03
    • 1970-01-01
    • 2020-07-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多