当默认操作为空时,为什么空的controllerName属性有效?

时间:2012-07-01 11:05:26

标签: c# asp.net-mvc asp.net-mvc-3

我正在阅读Pro ASP.NET MVC 3中的URL和Routes章节,并试图了解当对象默认值包含空值时会发生什么。这是我目前的路线。

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

以下是我使用对象默认值的可能组合进行的观察。 (在每种情况下,无法访问BOLD中的网址。

案例1

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

    new { controller="Home", action="" });
    
    1. http://mywebapp.net/
      错误:RouteData必须包含名为“action”的项,其中包含非空字符串值。
    2. http://mywebapp.net/Home/
      错误:RouteData必须包含名为“action”的项,其中包含非空字符串值。
    3. http://mywebapp.net/Home/Index/
    4. 第二个URL的上述错误是因为路由系统找不到默认操作名称。

      案例3

      new { controller="", action="" });
      
      1. http://mywebapp.net/
        错误:值不能为null或为空。参数名称:controllerName
      2. http://mywebapp.net/Home/
        错误:RouteData必须包含名为“action”的项目,其中包含非空字符串值。
      3. http://mywebapp.net/Home/Index/
      4. 第一个和第二个URL的上述错误是因为路由系统无法分别找到默认控制器和操作名称。

        案例4

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

        4. 如果案例3 中的controlleraction属性均为空,则表示我收到了错误消息。因此,在案例4 中,当controller属性为空值时,第二个网址http://mywebapp.net/Home/如何可访问?

          是否可以访问第二个URL这么简单,因为HomeController已经定义,路由系统是按照惯例找到它还是对这种行为有一些解释?是否可以对其进行修改以使第二个URL无法访问,或者这是否违反了配置约定原则?

1 个答案:

答案 0 :(得分:4)

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

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

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

如果您想了解有关路由如何工作的更多详细信息,我建议this post