0

在我的工作中,我必须解决一个URL重写问题。我必须使用的URL为模板:MVC4 Route as/{controler} - {id}而不是/ {controler}/{id}

{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视图环境不起作用。

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

回答

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 } 
    ); 
} 
+0

谢谢,这段代码有效。顺便说一句:是@“\ d +”路由中的数字的正则表达式? – 2013-03-24 14:48:31

+1

是的,'\ d +'是一个匹配一个或多个数字的正则表达式。 – 2013-03-24 14:51:35

0

我想你的请求被发现的第一个路由规则,然后动作id被视为一个整体的行动,而不是被处理。

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

+0

谢谢大家,订单的改变帮了很多忙了;) – 2013-03-24 14:47:43