Asp.net mvc 如何基于接受的HTTP谓词重载ASP.NET MVC操作?

Asp.net mvc 如何基于接受的HTTP谓词重载ASP.NET MVC操作?,asp.net-mvc,action,overloading,httpverbs,Asp.net Mvc,Action,Overloading,Httpverbs,想要对基于REST的API的GET/PUT/DELETE/POST使用相同的URL,但是当操作的唯一不同之处是它接受哪些HTTP谓词时,它会认为它们是重复的 “类型已使用相同的参数类型定义了名为“Index”的成员。” 我说过,那又怎样?这个只接受GET,这个只接受POST。。。应该能够共存吧 怎么做?这不是ASP.NET MVC限制或其他限制。NET和类的工作方式:无论您如何努力,都不能在同一个类上有两个同名的方法,它们采用相同的参数。您可以使用以下属性进行欺骗: [HttpGet] [Act

想要对基于REST的API的GET/PUT/DELETE/POST使用相同的URL,但是当操作的唯一不同之处是它接受哪些HTTP谓词时,它会认为它们是重复的

“类型已使用相同的参数类型定义了名为“Index”的成员。”

我说过,那又怎样?这个只接受GET,这个只接受POST。。。应该能够共存吧


怎么做?

这不是ASP.NET MVC限制或其他限制。NET和类的工作方式:无论您如何努力,都不能在同一个类上有两个同名的方法,它们采用相同的参数。您可以使用以下属性进行欺骗:

[HttpGet]
[ActionName("Foo")]
public ActionResult GetMe()
{
   ...
}

[HttpPut]
[ActionName("Foo")]
public ActionResult PutMe()
{
   ...
}

[HttpDelete]
[ActionName("Foo")]
public ActionResult DeleteMe()
{
   ...
}

[HttpPost]
[ActionName("Foo")]
public ActionResult PostMe()
{
   ...
}

当然,在真正的RESTFul应用程序中,不同的动词也会采用不同的参数,因此您很少会遇到这种情况


您可以看看如何组织路由的一些想法。

虽然ASP.NET MVC允许您使用相同的名称执行两个操作,但.NET不允许您使用具有相同签名的两个方法,即相同的名称和参数

您需要以不同的方式命名这些方法,使用
ActionName
属性告诉ASP.NET MVC它们实际上是同一个操作

也就是说,如果您谈论的是
GET
POST
,那么这个问题很可能会消失,因为
POST
操作将使用比
GET
更多的参数,因此可以区分

因此,您需要:

[HttpGet]
public ActionResult ActionName() {...}

[HttpPost, ActionName("ActionName")]
public ActionResult ActionNamePost() {...}
或:


另一种选择是使用一个方法,该方法接受all并区分HttpMethod,并从中调用适当的代码。例如

            string httpMethod = Request.HttpMethod.ToUpperInvariant();

            switch (httpMethod)
            {
                case "GET":
                    return GetResponse();

                case "POST":
                    return PostResponse();

                default:
                    throw new ApplicationException(string.Format("Unsupported HttpMethod {0}.", httpMethod));
            }

作为一种解决方法,您可以向其中一个方法添加一个带有默认值的额外参数,以绕过限制并能够构建


当然,请记住,这不是最推荐的方法,您还必须在代码中明确(通过参数名称或注释)这是一个额外的参数,以允许它进行构建,当然还要确保您正确地修饰了属性。

有点离题,但我正是用FubuMVC做这件事的,如果你有这样做的自由,值得一看“不同的动词也会有不同的参数”你能详细说明一下吗?我认为/users/[id]是一个很好的URL,可以接受GET、POST、PUT和DELETE所有相同的内容。。。唯一的区别是请求的内容,对吗?@Ryan,不,响应POST请求的操作将以您创建的视图模型作为操作参数:
[HttpPost]公共操作结果Foo(AModelToCreate模型){…}
这当然不同于只需要
id的GET操作。哦,我需要读懂它,我所用的只是从请求对象中提取变量…@Ryan,ooooooooo,你肯定需要读懂它。决不能从
请求中提取变量。您是如何处理验证之类的事情的,您是如何手动将所有这些字符串解析为它们各自的模型类型的?这就是ASP.NET MVC模型绑定的全部内容,它非常强大。HttpMethod的巧妙使用,但违反了SRP。
            string httpMethod = Request.HttpMethod.ToUpperInvariant();

            switch (httpMethod)
            {
                case "GET":
                    return GetResponse();

                case "POST":
                    return PostResponse();

                default:
                    throw new ApplicationException(string.Format("Unsupported HttpMethod {0}.", httpMethod));
            }