3

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

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 必须包含一个名为“action”的项目,其值为非空字符串。
  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 必须包含一个名为“action”的项目,其值为非空字符串。
  3. http://mywebapp.net/Home/Index/

上述第一个和第二个 URL 的错误是因为路由系统分别找不到默认控制器和操作名称。

案例4

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

Case 3controller中的和action属性都为空时,我收到了预期的错误。所以在案例 4中,当我的属性值为空时,如何访问第二个 URL http://mywebapp.net/Home/controller

它是否像第二个 URL 一样简单,因为已经定义了 HomeController 并且路由系统通过约定找到了它,或者对这种行为有一些解释?可以对此进行修改以使第二个 URL 不可访问,还是违反了约定优于配置的原则?

4

1 回答 1

4

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

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

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

如果您想了解有关路由如何工作的更多详细信息,我推荐这篇文章。

于 2012-07-01T17:54:21.707 回答