如何解决如何基于公认的HTTP动词来重载ASP.NET MVC操作?
| 希望为基于REST的API使用相同的URL进行GET / PUT / DELETE / POST,但是当Actions唯一不同的是它接受的HTTP动词时,它会认为它们是重复的! \“类型已经定义了具有相同参数类型的名为\'Index \'的成员。\” 我对那说了什么?这个只接受GET,这个只接受POST ...应该能够共存吧? 怎么样?解决方法
那不是ASP.NET MVC的限制或其他限制。它是.NET以及类的工作方式:无论您多么努力,都不能在同一个类上使用具有相同参数的两个名称相同的方法。您可以使用
[ActionName]
属性作弊:
[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应用程序中,不同的动词也会采用不同的参数,因此您很少会遇到这种情况。
您可以看一下SimplyRestful,以获取有关如何组织路线的一些想法。
, 虽然ASP.NET MVC允许您使用相同的名称进行两个操作,但.NET不允许您使用具有相同签名的两个方法-即使用相同的名称和参数。
您将需要使用ActionName
属性来不同地命名方法,以告诉ASP.NET MVC它们实际上是相同的操作。
就是说,如果您正在谈论ѭ3和ѭ4,这个问题可能会消失,因为ѭ4动作将比ѭ3接受更多的参数,因此可以区分。
因此,您需要:
[HttpGet]
public ActionResult ActionName() {...}
[HttpPost,ActionName(\"ActionName\")]
public ActionResult ActionNamePost() {...}
要么:
[HttpGet]
public ActionResult ActionName() {...}
[HttpPost]
public ActionResult ActionName(string aParameter) {...}
, 另一个选择是拥有一个接受所有方法并区分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));
}
, 作为一种解决方法,您可以在方法之一中添加一个带有默认值的额外参数,以绕过限制并能够构建。
当然,请记住,这不是最推荐的处理方式,并且您还必须在代码中(通过参数名称或通过注释)明确指出,这是一个额外的参数,仅是为了允许其构建,当然,请确保您已正确装饰属性。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。