在Controller中重载公共函数

时间:2011-07-22 06:27:51

标签: asp.net-mvc

我是MVC的新手。我正在浏览asp.net网站,发现这个link,它声明公共方法(动作)不能在控制器类中重载。但是在site中,它声明只有在[AcceptVerbs(HttpVerbs.Post)]使用一个函数时才有可能。

请你解释一下AcceptVerbs如何帮助重载函数。它实际上是在幕后做的?

在我的一个示例应用程序中,我可以在一个函数中使用[HttpPost]来重载函数。还有什么可以用于重载?

2 个答案:

答案 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