如何基于公认的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));
            }
    
        作为一种解决方法,您可以在方法之一中添加一个带有默认值的额外参数,以绕过限制并能够构建。 当然,请记住,这不是最推荐的处理方式,并且您还必须在代码中(通过参数名称或通过注释)明确指出,这是一个额外的参数,仅是为了允许其构建,当然,请确保您已正确装饰属性。     

要回复问题请先登录注册