0

同じページで異なるデータを送信する 2 つのフォームを含むページがあり、1 つは 2 つの ID を送信し、もう 1 つは 1 つの ID のみを送信するとします。どちらも同じページ (それ自体) に投稿しています。HTMLは次のようになります...

<form method="post">

<select name="regID">
...
</select>

<select name="jobID">
...
</select>

<input type="submit" value="Add">

</form>

<form method="post">

<button name="ID" type="submit" value="@ID">Remove</button>    

</form>

さて、コントローラーで最初のフォームを処理するために私ができること

 [HttpPost]
 public ActionResult Index(int regID, int jobID)
 {
 ....
 }

ただし、追加して2番目のフォームを処理しようとすると

 [HttpPost]
 public ActionResult Index(int ID)
 {
 ....
 }

送信ボタンをクリックすると、エラーが発生します

The current request for action 'Index' on controller type 'UserJobController' is ambiguous between the following action methods:
System.Web.Mvc.ActionResult Index(Int32) on type careerninja.Controllers.UserJobController
System.Web.Mvc.ActionResult Index(Int32, Int32) on type careerninja.Controllers.UserJobController 

それで、コントローラーで[HttpPost]メソッドを異なる値でオーバーロードして、2つの異なるフォームデータセットを処理することは可能ですか、それとも不可能ですか? この種の問題を処理するために把握していない可能性のある別の解決策はありますか?

基本的に、2番目のフォームでは、クリックするとコントローラーを呼び出してアイテムを削除し、アイテムを削除してからIndex()ビューを返す「削除」ボタンが必要です。

4

1 に答える 1

3

あなたのデザインを改善すれば、あなたが抱えている問題はもう問題ではなくなると思います。すべてがあなたの方法を通過しなければならないと信じているようですがIndex()、そうではありません。アクションの動作に合わせてメソッドの名前を再設計することは、通常、メソッドに名前を付ける方法です。

基本的に、2番目のフォームでは、クリックするとコントローラーを呼び出してアイテムを削除し、アイテムを削除してからIndex()ビューを返す「削除」ボタンが必要です。

したがって、呼び出されるメソッドを作成Remove()し、それをIndex()

public ActionResult Remove(int id)
{
  // do some work 

  this.RedirectToAction("Index");
}

メソッド名は、メソッドが何をしているかを表すものにすることをお勧めします。

public ActionResult Add(int regID, int jobID)
{
  // do some work

  this.RedirectToAction("Index");
}

: これは、ユーザー インターフェースの重要な設計でもあります。通常、ページがサーバーに対して POST を実行し、サーバーが HTML を返す場合、ユーザーがページを更新することを決定すると、通常、データを再送信するかどうかを尋ねるポップアップが表示されます。代わりに、前の例ではサーバー側のリダイレクトを行いました。これにより、2 番目の要求が GET として開始され、更新時にポップアップが発生するのを防ぎます。

于 2013-09-18T23:22:31.317 に答える