0

ここのところ:

  • 複数の送信があるページがあり、各送信は前の送信に依存しています。

  • 送信がクリックされるたびに、同じページがレンダリングされます。

  • コントローラー メソッド (ViewModel に基づく分岐) でスパゲッティ コードを記述していることに気付き、各送信の動作を個別のメソッドに分解したいと考えました。

  • ここにあるソリューションを実装しました。具体的には、Maartin Balliauw の記事に基づいて mkozicki が投稿したソリューションです。

  • これは、さまざまなコントローラー メソッドへの分岐にうまく機能しました。しかし、次の 2 つの問題に遭遇しました。

    1. 毎回同じビューに戻ります。
    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>

したがって:

  1. return View("SelectPlayer",new PlayerStatViewModel(...);毎回同じビュー (SelectPlayer.cshtml) を強制的にレンダリングするための最良の解決策で、フォークされたアクション メソッドから戻っていますか?
  2. ビューでアクション メソッド名をハードコーディングしないようにする方法はありますか (つまり、<form action="/PlayerStat/ChosenSeason" method="post">) 可能であれば引き続き使用したいと思い@using (Html.BeginForm())ます。
4

1 に答える 1

0
  1. return ステートメントでビュー名を指定することは、実行中の現在のアクション メソッドとは異なる名前のビューを返すための最良かつ最も実用的な方法です。これは、単一のビューからアクション メソッドを分離するための設計によるものだと思います。

  2. 繰り返しますが、現在の URL で指定されたもの以外のアクションにフォームを投稿する場合は、ビューに対して明示的に指定する必要があります。空BeginForm()を使用すると、フォームは前のリクエストで返されたのと同じ URL に投稿されます。

あなたが持っているものは、問題に取り組むための最良の方法であり、MVC アプリケーションを実装する方法でもあると思います。特にビューとビュー ロジックに関しては、それらは本質的に明示的であるため、明示的であることは何も悪いことではありません。異なる送信ボタンを異なるアクション メソッドに分離することは確実なアプローチであり、送信ボタンごとにどのアクションを対象とするかを本質的に指定する必要があります。このアプローチは、ボタン クリック用の Web フォームのサーバー側イベント ハンドラーに似ていると考えることができます (厄介なページのライフ サイクルはすべて除外されます)。このアプローチはエレガントでクリーンです。送信に対応するサーバー側のコードのみが実行されます。

于 2013-08-15T13:40:11.203 に答える