59

私のコントローラーには、「Friends」と呼ばれる2つのアクションがあります。実行されるものは、それが「get」か「post」かによって異なります。

したがって、私のコード スニペットは次のようになります。

// 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 つのメソッドがあるため、これはコンパイルされません。これを作成するにはどうすればよいですか?アクションを 1 つだけ作成する必要がありますが、その中で「取得」と「投稿」を区別する必要がありますか? もしそうなら、どうすればいいですか?

4

7 に答える 7

127

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();
}
于 2009-04-07T07:03:59.603 に答える
25

本当に 1 つのルーチンで両方の動詞を処理したい場合は、次のようにします。

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

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

于 2010-07-12T03:05:11.890 に答える
9

使用してみてください:

[AcceptVerbs(HttpVerbs.Post | HttpVerbs.Get)]
public ActionResult Friends()
{
    // do some stuff
    return View();
}
于 2012-07-26T21:18:16.583 に答える
3

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

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

私はそれが醜くてハックであることを知っていますが、うまくいきます。

于 2009-04-07T07:04:30.490 に答える
2

私の質問に答えたので、カグダスの応答を答えとしてマークします。ただし、プロジェクトで 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();
}
于 2009-04-07T07:24:19.287 に答える
1

ポストで受け取りたいパラメーターを 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();
}

編集:上記のように、投稿されたアイテムを受け取るには、より型指定されたアプローチを使用することが望ましいでしょう。

于 2009-04-07T07:27:06.160 に答える
0

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

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

それがあなたのシナリオと一致するかどうかはわかりませんが、同じ問題が発生したときは常にそうでした.

于 2010-12-20T20:21:57.287 に答える