MVC3 ActionName属性,其行为和效果

thi*_*mmk 12 asp.net asp.net-mvc razor asp.net-mvc-3

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

[ActionName("Test")]
public ActionResult Index()
{
      return View();
}
[ActionName("Index")]
public ActionResult Test()
{
      return View();
}
Run Code Online (Sandbox Code Playgroud)

我认为这会以某种无限循环结束,或者会产生一些歧义异常.但同样工作正常,第二种方法在我给这个网址时被调用http://mysite:1234/mycontroller

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

知道为什么会这样吗?

And*_*rew 18

菲尔·哈克(Phil Haack)就此事发表了一篇文章:一种方法如何成为一种行动

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

ActionNameAttribute重新定义方法的名称.

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


Cha*_*ani 8

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

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

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

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