13

在阅读 mcv3 时,我遇到了一个名为[ActionName]. 它实际上为操作方法提供了一个新名称。我测试了一个让我思考的场景;内部是如何工作的。当我的控制器类中有以下两种操作方法时

[ActionName("Test")]
public ActionResult Index()
{
      return View();
}
[ActionName("Index")]
public ActionResult Test()
{
      return View();
}

我认为这会以某种无限循环结束,或者会给出一些模棱两可的异常。但是同样的工作正常,当我给这个网址时调用第二种方法http://mysite:1234/mycontroller

是什么让 MVC 引擎选择第二种方法而不是第一种?

知道为什么会这样吗?

4

3 回答 3

18

Phil Haack 有一篇关于这个问题的帖子:方法如何变成行动

简而言之:ControllerActionInvoker 使用反射来查找与操作名称匹配的方法。

ActionNameAttribute 重新定义方法的名称。

另请注意,您的视图名称与 ActionName 匹配,而不是 MethodName:方法 Index 将搜索名称为“Test”的视图

于 2012-04-11T06:58:03.517 回答
8

这就是路由引擎的神奇之处。在 global.asax.cs 文件中的某个地方会定义路由模式,大部分默认为

 routes.MapRoute(
          "Default",                                              // Route name
          "{controller}/{action}/{id}",                           // URL with parameters
          new { controller = "Home", action = "Index", id = "" }  // Parameter defaults
          );

这是为您的应用程序定义的路由模式。动作名称属性映射到参数集合中的“动作”参数(MapRoute 的第三个参数)。

在您的情况下,如果您将操作“索引”映射到方法“测试”。它应该调用 Test() 方法。我不确定它是否仍在为您调用 Index()。事实上,如果路由引擎在你的公共方法上找到 ActionName 属性,它并不关心方法名称。

于 2012-04-11T06:32:54.120 回答
1

ActionNameAttribute 它表示用于操作名称的属性。如果它不存在,则使用方法的名称。

于 2013-06-03T12:14:45.160 回答