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"的视图
这是路由引擎的神奇之处.在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属性,则它不关心方法名称.
| 归档时间: |
|
| 查看次数: |
25184 次 |
| 最近记录: |