7

私はまだ ASP.NET MVC 3 に比較的慣れていないので、ここでの経験が豊富な方に概念的な質問があります。

(単純な)例として、イベントのサインアップフォームがあるとしましょう。フォームには、イベントの名前と、ユーザーが自分の名前を入力できるテキスト ボックスが表示されます。ViewModel は次のようになります。

public class SignupFormViewModel {
   public string EventName { get; set; }
   [Required]
   public string VolunteerName { get; set; }
}

Razor ビューは次のようになります。

<h2>Sign up for @Model.EventName</h2>
@using (Html.BeginForm()) {
@Html.ValidationSummary(true)
<div class="editor-field">
    @Html.EditorFor( model => model.VolunteerName )
    @Html.ValidationMessageFor( model => model.VolunteerName  )
</div>
}

ユーザーがフォームをサーバーに送信し、ModelState が無効な場合は、元のビューを返し、エラーを表示できるようにモデルを返します。(この例では、これはクライアントで処理されないエラーであると想定しています)

問題は、上記の例のビューでは、EventName がフォーム データと共に送信されないことです。フォームフィールドではなく、ページコンテンツにのみ使用したい. しかし、戻って検証エラーをユーザーに表示する必要がある場合は、EventName プロパティが失われています。

では、同じビューに戻ってくる投稿を通じて、このフォームフィールド以外のアイテムを保持するためのオプションは何ですか?

EventName プロパティを保持する隠しフィールドを作成できることはわかっていますが、フォーム フィールド以外のすべてのプロパティを隠しフィールドに配置することを余儀なくされていることについては、何か違和感があります。また、コントローラーで HttpPost アクションに入り、ビューを返す前にそのデータをモデルに再読み込みできることもわかっていますが、これも扱いにくいと感じます。

私はこれを行うための基本的な方法をよく理解していると思いますが、よりクリーンな方法やベストプラクティスがあるかどうか疑問に思っていました.

ありがとう

4

1 に答える 1

7

これに非表示フィールドを使用しても問題はありません。これは、実際にはフォーム フィールドとして表示させたくない場合に、リクエストに対して永続化する非常に従来の方法です。

HTTP はステートレスであることを念頭に置いてください。そのため、ページに何かをドロップして POST リクエストで再度ピックアップすることは、実際には、ステートフルであるかのような錯覚を与える別のメカニズムを使用するよりも、複数のリクエストにわたってそのデータを永続化するより適合した方法です。

これによりマークアップが乱雑になりすぎると感じた場合はTempData、最初の GET リクエストで値をコレクションに入れてみることができます。これは、次のリクエストの間だけ存在し、次のコントローラー アクションで取得できるようにします。 :

TempData["MyVar"] = model.EventName

ただし、これを従来の (そして - 私の意見では - 最良の) 方法でモデルに永続化させたい場合は、隠しフィールドを使用することをお勧めします。

@Html.HiddenFor(m => m.EventName)

さらに読むために、cookieまたはsession stateも考慮することができますが、これらはどちらもモデル内の値を保持しません。ただし、これらのメカニズムには両方とも制限があります。これについては、こちらの別の回答で概説しています。

于 2013-06-04T18:05:37.223 に答える