Asp.net mvc 控制器中公共函数的重载

Asp.net mvc 控制器中公共函数的重载,asp.net-mvc,Asp.net Mvc,我是MVC新手。我在浏览asp.net站点时发现,它指出在控制器类中不能重载公共方法操作。然而,在本文中,它指出只有在我使用[AcceptVerbsHttpVerbs.Post]和一个函数时才可能实现 你能解释一下AcceptVerbs是如何帮助重载函数的吗?它在幕后到底做了什么 在我的一个示例应用程序中,我可以通过在一个函数中使用[HttpPost]来重载该函数。还有什么可以用来重载的呢?基本上,当它响应不同类型的请求时,您可以处理这个问题,所以Post/Get/Delete。HttpVerb

我是MVC新手。我在浏览asp.net站点时发现,它指出在控制器类中不能重载公共方法操作。然而,在本文中,它指出只有在我使用[AcceptVerbsHttpVerbs.Post]和一个函数时才可能实现

你能解释一下AcceptVerbs是如何帮助重载函数的吗?它在幕后到底做了什么


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

基本上,当它响应不同类型的请求时,您可以处理这个问题,所以Post/Get/Delete。HttpVerbs枚举中的任何项


这是由于它执行在控制器中调用的方法解析的方式,并且指定该方法允许它处理解析

在ASP.NET MVC中,传入的请求url应与控制器的操作相匹配。在MVC请求处理管道中,首先选择控制器操作,然后检查并填充其参数。想象一下,如果控制器重载了两个名称相同但签名不同的方法,会发生什么情况。c编译器不会抱怨,因为它理解代码,因为它可以根据参数签名区分方法。但是ASP.NETMVC请求匹配机制,如上所述,不能-它首先搜索操作,只有在选择操作后,它才会查看其参数。正因为如此,控制器中的公共操作不能被重载——如果除了参数以外的方法操作之间没有区别,MVC中的操作选择将无法明确地选择一个。这就是发挥作用的地方。这是开发人员影响MVC在指定控制器中搜索有效操作的基本机制。它有一个方法,告诉MVC是否可以选择动作来使用。所有[AcceptVerbs]、[HttpGet]、[HttpPost]、[HttpPut]、[HttpDelete]和[HttpNoAction]都源自此属性。宾果游戏-现在方法重载是可能的-尽管操作具有相同的名称,但上面的一个属性或从ActionMethodSelectorAttribute派生的自定义属性可以告诉MVC选择哪个操作以及不选择哪个。MVC现在明确地知道,该操作对于请求是有效的。考虑例子

    [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