2015-02-05 59 views
4

比方说,我只有这条路:瞄准在其他控制器相同的操作方法生成传出URL

routes.MapRoute("MyRoute", "{controller}/{action}/{id}", 
     new 
     { 
      controller = "Home", 
      action = "Index", 
      id = UrlParameter.Optional 
     }); 

我们可以看到,我们的启动页面将Home/Index

而且我们说,我已经创建的视图使用此代码锚元素:

@Html.ActionLink("This targets another controller","Index", "Admin") 

当我渲染视图,你会看到生成以下HTML:

<a href="/Admin">This targets another controller</a> 

我们的要求对于以Admin控制器上的Index操作方法为目标的URL,已通过ActionLink方法表示为/Admin。路由系统非常聪明,它知道应用程序中定义的路由默认使用Index操作方法,允许它省略不需要的段。

,问题是:

如果我改变的路线:

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

为:

routes.MapRoute("Default", "{controller}/{action}/{id}/{*catchall}", 
     new 
     { 
      controller = "Home", 
      action = "Index", 
      id = UrlParameter.Optional 
     }); 

接着,下面的HTML将生成:

<a href="/Admin/Index">This targets another controller</a> 

你能解释一下我为什么?

+0

我会认为这条路线会有问题。有两个模式段是可选的,除非你有'/ Admin/Index // 4',否则'/ Admin/Index/4'的意思是id = 4或者name = 4是不确定的。 – Tejs 2015-02-05 17:43:56

+0

您是否在项目中使用区域? – NightOwl888 2015-02-05 19:39:26

+0

只有最后一个参数可以是可选的。 – 2015-02-06 02:24:24

回答

2

两个:

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

和:

routes.MapRoute("Default", "{controller}/{action}/{id}/{*catchall}", 
    new 
    { 
     controller = "Home", 
     action = "Index", 
     id = UrlParameter.Optional 
    }); 

无效路由定义,因为只有一个路线的最后一段可以是可选的。否则,路由引擎无法消除您的路由歧义。

现在回到你原来的问题,为什么对于这些​​路线框架不推断/Index部分。这是因为框架,评估你的路由模式时,看到这一点:

{controller}/{action}/{id}/{name} 

请参阅{id}部分路线的?当分析了这种模式事先知道该{action}部分之后(在你的情况{id})一非可选段,你必须始终存在。而且由于它知道这一点,很明显,它不会很聪明,省略了部分,甚至不尝试。另一方面,您可以指定最后一个段的默认值,并且在生成具有此值的路由时将省略该值。

+0

现在,这是有道理的。 *当它分析这种模式时,它事先知道{action}部分后面跟着一个必须指定的非可选参数id。*非常感谢答案。 但是,一个奇怪的是,我找不到任何官方消息来源表明对可选参数的限制。 – 2015-02-09 18:21:11

相关问题