web-dev-qa-db-ja.com

同じメソッドシグネチャで投稿および取得する

私のコントローラーには、「友達」と呼ばれる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つだけ作成する必要がありますが、その内部の「取得」と「投稿」を区別しますか?もしそうなら、どうすればいいですか?

51
codette

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();
}
115
Çağdaş Tekin

本当に1つのルーチンで両方の動詞を処理したい場合は、次のことを試してください。

[AcceptVerbs("Get", "Post")]
public ActionResult ActionName(string param1, ...)
{
//Fun stuff goes here.
}

1つの潜在的な注意:私はMVCリリース2を使用しています。これがMVC 1でサポートされていたかどうかはわかりません。AcceptVerbsのIntellisenseドキュメントで通知されます。

20
mohrtan

使用してみてください:

[AcceptVerbs(HttpVerbs.Post | HttpVerbs.Get)]
public ActionResult Friends()
{
    // do some stuff
    return View();
}
6
KateA

それが私の質問に答えたので、カグダスの回答を回答としてマークします。ただし、プロジェクトで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();
}
2
codette

それが正しい方法であるかどうかは完全にはわかりませんが、意味のないパラメーターを使用してシグを区別します。お気に入り:

// 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();
}

私はそれが醜くハックだと知っていますが、うまくいきます。

2
Ariel

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();
}

編集:上記のように、投稿されたアイテムを受け取るには、より型付きのアプローチを使用することをお勧めします。

1
Matt Kocaj

アクションメソッドが同じことを行うことはできません。そうでない場合、2つのアクションメソッドを記述する必要はありません。では、セマンティクスが異なる場合は、アクションメソッドにも異なる名前を使用してみませんか?

たとえば、「削除」アクションメソッドがあり、GETが確認を要求するだけの場合は、GETメソッドを「ConfirmDelete」とPOSTメソッドを「削除」のみと呼びます。

それがあなたのシナリオに一致するかどうかはわかりませんが、私が同じ問題を抱えていたときはいつもそうでした。

0
Adrian Grigore