ここのところ:
複数の送信があるページがあり、各送信は前の送信に依存しています。
送信がクリックされるたびに、同じページがレンダリングされます。
コントローラー メソッド (ViewModel に基づく分岐) でスパゲッティ コードを記述していることに気付き、各送信の動作を個別のメソッドに分解したいと考えました。
ここにあるソリューションを実装しました。具体的には、Maartin Balliauw の記事に基づいて mkozicki が投稿したソリューションです。
これは、さまざまなコントローラー メソッドへの分岐にうまく機能しました。しかし、次の 2 つの問題に遭遇しました。
- 毎回同じビューに戻ります。
- View.cshtml でのアクション メソッド名の配線
コードは次のとおりです。
コントローラ:
public class PlayerStatController : Controller
{
public class PlayerStatViewModel . . . //quite complex ViewModel
// HTTP GET
public ActionResult SelectPlayer()
{
List<string> idx_list = getSeasonIndex();
return View(new PlayerStatViewModel(idx_list));
}
// One of three forked action methods
[HttpPost]
[MultipleButton(Name = "action", Argument = "ChosenSeason")]
public ActionResult ChosenSeason(PlayerStatViewModel viewModel)
{
List<string> team_idx = getTeamNameIndex(viewModel.selected_seasonIndex);
return View("SelectPlayer",new PlayerStatViewModel(new List<string>(), team_idx, new List<string>(), 0));
}
ビューからの抜粋 (SelectPlayer.cshtml)
<form action="/PlayerStat/ChosenSeason" method="post">
<fieldset>
<legend>Select Season</legend>
<div class="editor-field">
@Html.LabelFor(m => m.selected_seasonIndex)
@Html.DropDownListFor(m => m.selected_seasonIndex, Model.seasonIndex_select_list)
@Html.ValidationMessageFor(m => m.selected_seasonIndex)
</div>
<p>
<input type="submit" value="Choose Season" name="action:ChosenSeason" />
</p>
</fieldset>
</form>
したがって:
return View("SelectPlayer",new PlayerStatViewModel(...);
毎回同じビュー (SelectPlayer.cshtml) を強制的にレンダリングするための最良の解決策で、フォークされたアクション メソッドから戻っていますか?- ビューでアクション メソッド名をハードコーディングしないようにする方法はありますか (つまり、
<form action="/PlayerStat/ChosenSeason" method="post">
) 可能であれば引き続き使用したいと思い@using (Html.BeginForm())
ます。