2009-04-07 22 views
47

私のコントローラには、「Friends」という2つのアクションがあります。実行するものは、 "取得"対 "投稿"のどちらであるかによって異なります。投稿と同じメソッドシグネチャを取得

は、だから私のコードスニペットは、このような何かを見て:私は同じシグネチャ(友人)との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(); 
} 

しかし、これはコンパイルされません。これを作成するにはどうすればいいですか?私はただ一つのアクションを作成する必要がありますが、その中の "get"と "post"を区別する必要はありますか?もしそうなら、どうしたらいいですか?

答えて

106

"Friends_Post"のように2番目のメソッドの名前を変更し、次に[ActionName("Friends")]属性を2番目のメソッドに追加できます。リクエストタイプとして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(); 
} 
+7

MVC 2.0から '[AcceptVerbs(HttpVerbs。他のRESTメソッドについても同様です。 – nimrod

2

正しい方法であるかどうかは完全にはわかりませんが、私はsigsを区別するために無意味なパラメータを使用します。 like:

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

私はそれが醜いとhackishだと知っているが、それは動作します。

2

私の質問に答えて以来、答えとしてカガダの応答をマークしています。しかし、私は私のプロジェクトでActionName属性を使うのが好きではないので、私は別の解決方法を使用します。私は単純にポストで受信したいためにPostメソッドにのparamsを追加します(メソッドのシグネチャを変更終わる)「ポスト」アクション

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

投稿されたアイテムを受け取るより型付きのアプローチを使用することをお勧めします。 - 回答 –

1

にFormCollectionを追加しました。

// Post: 
[AcceptVerbs(HttpVerbs.Post)] 
public ActionResult Friends(Friend friend) 
{ 
    // do some stuff 
    return View(); 
} 

編集:あなたはこのような複合型、持っている場合

// Post: 
[AcceptVerbs(HttpVerbs.Post)] 
public ActionResult Friends(string friendName, string otherField) 
{ 
    // do some stuff 
    return View(); 
} 

..or:多分、このように受信したことにより入力された-アプローチを使用することが好ましい投稿上記のようなアイテム。あなたが本当にのみ、両方の動詞を処理するために、1つのルーチンをしたい場合は

16

、これを試してみてください。

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

一つの潜在的警告:これはMVC 1インテリセンスでサポートされていた場合、私はわからないMVCリリース2を使用していますAcceptVerbsのドキュメントにご連絡ください。

+3

[AcceptVerbs( "Get"、 "Get")]を[HttpGet] Post ")]はコンストラクタがAcceptVerbsAttribute(params string [] verbs)として定義されているので動作します。見た目が穏やか。 – jamiebarrow

+0

ありがとう!私はそれがより好きです。 – mohrtan

0

あなたのアクションメソッドは同じことをすることはできません。そうでなければ、2つのアクションメソッドを書く必要はありません。したがって、セマンティクスが異なる場合は、アクションメソッドにも異なる名前を使用してください。

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

あなたのシナリオに合っているかどうかはわかりませんが、同じ問題があったときはいつも私のためでした。

4

を使用してみてください:

[AcceptVerbs(HttpVerbs.Post | HttpVerbs.Get)] 
public ActionResult Friends() 
{ 
    // do some stuff 
    return View(); 
} 
関連する問題