2012-07-01 28 views
3

我正在阅读Pro ASP.NET MVC 3中的URL和Routes章节,并试图查看当对象默认值包含空值时会发生什么。这是我目前的路线。为什么空的controllerName属性在默认操作为空时工作?

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

以下是我用对象默认值的可能组合进行的观察。 (在每种情况下,在BOLD URL是不可访问的。

案例1

new { controller="Home", action="Index" }); 
  1. http://mywebapp.net/
  2. http://mywebapp.net/Home/
  3. http://mywebapp.net/Home/Index/

案例2

new { controller="Home", action="" }); 
  1. http://mywebapp.net/
    错误:的RouteData必须包含一个名为 '动作' 与非空字符串值项。
  2. http://mywebapp.net/Home/
    错误:RouteData必须包含名为'action'的项目,其中包含非空字符串值。
  3. http://mywebapp.net/Home/Index/

与第二URL上述错误是因为路由系统无法找到一个默认的动作名称。

案例3

new { controller="", action="" }); 
  1. http://mywebapp.net/
    错误:值不能为空。参数名:controllerName
  2. http://mywebapp.net/Home/
    错误:的RouteData必须包含一个名为“动作”与非空字符串值项。
  3. http://mywebapp.net/Home/Index/

与第一和第二的网址上述错误是因为路由系统无法找到各自默认的控制器和动作名字。

案例4

new { controller="", action="Index" }); 
  1. http://mywebapp.net/
    错误:值不能为空。参数名称:controllerName
  2. http://mywebapp.net/Home/(如何以及为什么可以访问?)
  3. http://mywebapp.net/Home/Index/

当两个controlleraction性质案例3是空的,我果然收到错误。所以在案例4,当我有一个controller属性的空值时,第二个URL如何得到http://mywebapp.net/Home/

是否可以访问第二个URL,因为HomeController已经定义,路由系统是按照惯例找到的,或者是否存在对此行为的解释?这可以修改,让第二个网址无法访问或这违反了约定配置原则吗?

+1

由于您已经指定了控制器并且已配置了默认操作,因此情况4.1可以正常工作。我更担心Case 2.1的工作原理,因为没有配置默认操作。 –

+0

@RichardSzalay:谢谢你指出。我想我忽略了它。 **案例2.1也不起作用**。我更新了这个问题。 – Animesh

回答

4

HomeIndex不是硬编码约定,除非您将它们指定为默认值,否则运行时不会尝试查找它们。

情况2.1不起作用,因为该URL没有包含action参数的值,并且没有action默认值。

案例4.1不起作用,因为该URL没有包含controller参数的值,并且没有controller默认值。

如果您想了解更多关于路由如何工作的细节,我建议this post

+0

谢谢你的回应。不要听起来傲慢,但我有点理解为什么2.1和4.1不起作用。对不起,我的问题没有说清楚。我更想知道4.2是否仅仅是因为主控制器存在于预定位置而工作,因为我没有为默认控制器指定一个名称。 – Animesh

+0

我忘记提及您的博客文章非常翔实。感谢您链接它。 – Animesh

+0

@Nanda 4.2可以工作,因为URL包含'controller'参数的值,并且''action'有一个非空的默认值。默认值仅在URL不包含参数值时使用。 –

相关问题