在阅读mcv3时,我遇到了一个名为[ActionName]
的属性名称。它实际上为action方法赋予了新名称。我测试了一个让我思考的场景;内部是如何工作的。当我在控制器类中有以下两个操作方法时
[ActionName("Test")]
public ActionResult Index()
{
return View();
}
[ActionName("Index")]
public ActionResult Test()
{
return View();
}
我认为这会以某种无限循环结束,或者会产生一些歧义异常。但同样工作正常,当我给这个网址http://mysite:1234/mycontroller
是什么让MVC引擎选择第二种方法而不是第一种?
知道为什么会这样吗?
答案 0 :(得分:18)
简而言之: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表示用于操作名称的属性。如果不存在,则使用方法的名称。