MVC 4路由为/ {controller} - {id}而不是/ {controller} / {id}

时间:2013-03-24 14:35:39

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

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

{controller}/{action}-{id}

而不是

{controller}/{action}/{id}

因此处理后的网址应如下所示:

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环境将无效。

我有什么办法可以解决这个问题吗?感谢所有帮助。

2 个答案:

答案 0 :(得分:4)

路线的评估顺序与您定义的顺序相同,因此请确保遵守相同的顺序。同时为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 }
    );
}

答案 1 :(得分:0)

我认为您的请求正在由第一个路由规则进行处理,然后action-id被视为整个操作而未被发现。

在默认路线前设置NewRoute。只需移动代码即可。