我是MVC的新手。我正在浏览asp.net网站,发现这个link,它声明公共方法(动作)不能在控制器类中重载。但是在site中,它声明只有在[AcceptVerbs(HttpVerbs.Post)]
使用一个函数时才有可能。
请你解释一下AcceptVerbs如何帮助重载函数。它实际上是在幕后做的?
在我的一个示例应用程序中,我可以在一个函数中使用[HttpPost]
来重载函数。还有什么可以用于重载?
答案 0 :(得分:0)
基本上,规则是您可以在响应不同类型的请求时处理此问题,因此发布/获取/删除。 (HttpVerbs
枚举中的任何项目)
这是由于它解决了在控制器中调用方法的方式,并且指定方法允许它处理分辨率。
答案 1 :(得分:0)
在ASP.NET MVC中,传入请求URL应与控制器的操作匹配。在MVC请求处理管道中,首先选择控制器动作,然后检查并填充其参数。想象一下,如果控制器有两个具有相同名称但签名不同的方法(重载)会发生什么.c#编译器不会抱怨,因为它理解代码,因为它可以区分基于其参数签名的方法。但是,如上所述,ASP.NET MVC请求匹配机制不能 - 它首先搜索动作,并且只有在选择动作之后,才需要查看其参数。因此,“控制器中的公共操作不能被重载” - 如果除了参数之外的方法(操作)之间没有区别,MVC中的操作选择将无法明确地选择一个。这是ActionMethodSelectorAttribute发挥作用的地方。这是开发人员影响MVC在指定控制器中搜索有效操作的方式的基本机制。它有方法IsValidForRequest()
告诉MVC可以选择使用或不使用。所有[AcceptVerbs]
,[HttpGet]
,[HttpPost]
,[HttpPut]
,[HttpDelete]
和[HttpNonAction]
都来自此属性。和bingo - 现在方法重载是可能的 - 尽管动作具有相同的名称,上面的一个属性(或从ActionMethodSelectorAttribute
派生的自定义属性)可以告诉MVC wchich动作选择和哪一个没有。而MVC现在毫不含糊地知道wchich动作对请求有效。考虑示例
[HttpGet]
public ActionResult Index()
{
// The above HttpGet.IsValidForRequest() called internally
by mvc will return true only if request is made via HTTP GET
}
[HttpPost]
public ActionResult Index(MyModel model)
{
// The above HttpPost.IsValidForRequest() called internally
by mvc will return true only if request is made via HTTP POST
}
// And so forth with other ActionMethodSelectorAttibute s. As you see, only one action from same named ones is valid for single request when decorated with any of builtin ActionMethodSelectorAttibute