MVC3 ActionName属性,其行为和效果

时间:2012-04-11 06:16:03

标签: asp.net asp.net-mvc asp.net-mvc-3 razor

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

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

我认为这会以某种无限循环结束,或者会产生一些歧义异常。但同样工作正常,当我给这个网址http://mysite:1234/mycontroller

时,会调用第二种方法

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

知道为什么会这样吗?

3 个答案:

答案 0 :(得分:18)

菲尔·哈克(Phil Haack)有一篇关于此事的帖子:How a method becomes an action

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

ActionNameAttribute重新定义方法的名称。

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

答案 1 :(得分:8)

这是Routing engine的神奇之处。在global.asax.cs文件中的某个位置会定义路由模式,大多数默认为

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

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

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

答案 2 :(得分:1)

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