私のコントローラーには、「友達」と呼ばれる2つのアクションがあります。実行されるのは、「取得」か「投稿」かによって異なります。
したがって、私のコードスニペットは次のようになります。
// Get:
[AcceptVerbs(HttpVerbs.Get)]
public ActionResult Friends()
{
// do some stuff
return View();
}
// Post:
[AcceptVerbs(HttpVerbs.Post)]
public ActionResult Friends()
{
// do some stuff
return View();
}
ただし、同じシグネチャを持つ2つのメソッド(Friends)があるため、これはコンパイルされません。これを作成するにはどうすればよいですか?アクションを1つだけ作成する必要がありますが、その内部の「取得」と「投稿」を区別しますか?もしそうなら、どうすればいいですか?
2番目のメソッドの名前を「Friends_Post」などに変更すると、2番目のメソッドに[ActionName("Friends")]
属性を追加できます。したがって、POSTをリクエストタイプとして持つFriendアクションへのリクエストは、そのアクションによって処理されます。
// Get:
[AcceptVerbs(HttpVerbs.Get)]
public ActionResult Friends()
{
// do some stuff
return View();
}
// Post:
[ActionName("Friends")]
[AcceptVerbs(HttpVerbs.Post)]
public ActionResult Friends_Post()
{
// do some stuff
return View();
}
本当に1つのルーチンで両方の動詞を処理したい場合は、次のことを試してください。
[AcceptVerbs("Get", "Post")]
public ActionResult ActionName(string param1, ...)
{
//Fun stuff goes here.
}
1つの潜在的な注意:私はMVCリリース2を使用しています。これがMVC 1でサポートされていたかどうかはわかりません。AcceptVerbsのIntellisenseドキュメントで通知されます。
使用してみてください:
[AcceptVerbs(HttpVerbs.Post | HttpVerbs.Get)]
public ActionResult Friends()
{
// do some stuff
return View();
}
それが私の質問に答えたので、カグダスの回答を回答としてマークします。ただし、プロジェクトでActionName属性を使用したくないので、別のソリューションを使用します。 FormCollectionを「post」アクションに追加しただけです(これにより、メソッドシグネチャが変更されます)。
// Get:
[AcceptVerbs(HttpVerbs.Get)]
public ActionResult Friends()
{
// do some stuff
return View();
}
// Post:
[AcceptVerbs(HttpVerbs.Post)]
public ActionResult Friends(FormCollection form)
{
// do some stuff
return View();
}
それが正しい方法であるかどうかは完全にはわかりませんが、意味のないパラメーターを使用してシグを区別します。お気に入り:
// Get:
[AcceptVerbs(HttpVerbs.Get)]
public ActionResult Friends(bool isGet)
{
// do some stuff
return View();
}
// Post:
[AcceptVerbs(HttpVerbs.Post)]
public ActionResult Friends()
{
// do some stuff
return View();
}
私はそれが醜くハックだと知っていますが、うまくいきます。
postメソッドに、投稿で受信するパラメータを追加します。おそらくこのように:
// Post:
[AcceptVerbs(HttpVerbs.Post)]
public ActionResult Friends(string friendName, string otherField)
{
// do some stuff
return View();
}
..または次のような複合型がある場合:
// Post:
[AcceptVerbs(HttpVerbs.Post)]
public ActionResult Friends(Friend friend)
{
// do some stuff
return View();
}
編集:上記のように、投稿されたアイテムを受け取るには、より型付きのアプローチを使用することをお勧めします。
アクションメソッドが同じことを行うことはできません。そうでない場合、2つのアクションメソッドを記述する必要はありません。では、セマンティクスが異なる場合は、アクションメソッドにも異なる名前を使用してみませんか?
たとえば、「削除」アクションメソッドがあり、GETが確認を要求するだけの場合は、GETメソッドを「ConfirmDelete」とPOSTメソッドを「削除」のみと呼びます。
それがあなたのシナリオに一致するかどうかはわかりませんが、私が同じ問題を抱えていたときはいつもそうでした。