REST ベースの API の GET/PUT/DELETE/POST に同じ URL を使用したかったのですが、アクションの唯一の違いが、受け入れる HTTP 動詞である場合、それらは重複していると見なされます!
「型は、同じパラメーター型を持つ 'Index' というメンバーを既に定義しています。」
私が言ったので、何ですか?これはGETのみを受け入れ、これはPOSTのみを受け入れます...共存できるはずですよね?
どのように?
REST ベースの API の GET/PUT/DELETE/POST に同じ URL を使用したかったのですが、アクションの唯一の違いが、受け入れる HTTP 動詞である場合、それらは重複していると見なされます!
「型は、同じパラメーター型を持つ 'Index' というメンバーを既に定義しています。」
私が言ったので、何ですか?これはGETのみを受け入れ、これはPOSTのみを受け入れます...共存できるはずですよね?
どのように?
それは ASP.NET MVC の制限などではありません。それは .NET であり、クラスのしくみです。どんなに頑張っても、同じパラメーターを受け取る同じクラスで同じ名前の 2 つのメソッドを持つことはできません。[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 では同じ名前の 2 つのアクションを使用できますが、.NET では同じ署名 (つまり、同じ名前とパラメーター) を持つ 2 つのメソッドを使用できません。
ActionNameASP.NET MVC に実際には同じアクションであることを伝えるために、属性を使用してメソッドに異なる名前を付ける必要があります。
GETとはいえ、 aと aについて話している場合、アクションは よりも多くのパラメーターを取り、したがって区別できるためPOST、この問題は解消される可能性があります。POSTGET
したがって、次のいずれかが必要です。
[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));
}
回避策として、制限を回避してビルドできるようにするために、メソッドの 1 つにデフォルト値を持つ追加の引数を追加できます。
もちろん、これは最も推奨される方法ではないことに注意してください。また、コード内で (パラメーター名またはコメントを使用して) これがビルドを許可するためだけの追加の引数であることを明確にする必要があります。もちろん、属性を正しく装飾していることを確認してください。