2013-06-04 9 views
5

私はまだASP.NET MVC 3の新機能ですが、ここでは経験豊富な概念的な質問があります。非形式を維持するASP.NET MVCのモデルデータ

私はイベントの申し込みフォームを持っています(簡単な例)。フォームにはイベントの名前と、ユーザーが名前を入力できるテキストボックスが表示されます。ユーザーがサーバーにフォームを送信するとにModelStateが無効である、我々は返す場合

<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> 
} 

:レイザービューはこのようになります

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

:ViewModelには、次のようになりますオリジナルエラーを表示できるようにモデルを表示して戻します。 (この例では、これがクライアント上で処理されないエラーであると仮定しています)

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

この非フォームフィールド項目を同じビューに戻ってくるポストで保存するための選択肢は何ですか?

私はEventNameプロパティを保持するために非表示のフィールドを作成できますが、非フォームフィールドの各プロパティを非表示のフィールドに配置することを強いられることはありません。私はコントローラのHttpPostアクションに入り、ビューに戻る前にそのデータをモデルにリロードすることもできると知っていますが、それも厄介です。

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

ありがとうございます。

答えて

5

これには非表示フィールドを使用することは間違いありません。これは、実際にフォームフィールドとして表示させたくない場合に、要求を永続化する従来の方法です。

HTTPはステートレスですなので、ページ上に何かをドロップしてPOSTリクエストで再びそれをピックアップするのは、実際には、そのデータを複数のリクエストで永続化するためのより適合した方法です。ステートフルな錯覚を与えます。

これがマークアップをあまりにも騒がせていると感じる場合は、最初のGETリクエストでTempDataコレクションに値を入れてみてください。これは次のリクエストの間のみ存在し、あなたの次のコントローラのアクションに:あなたは、従来の( - 私の意見では - と最高)であるとして、これはあなたのモデルに固執する場合は

TempData["MyVar"] = model.EventName 

ただし、これを行う方法は、隠しフィールドはまだへの道ですgo:

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

さらに読むためにはcookiesまたはsession stateと考えることもできますが、どちらもモデルの値を保持しません。しかし、これらのメカニズムの両方には限界があります。私は概説しています。another answer, here.

+0

私はTempData上でViewDataを選択します。 TempDataは、セッションを不必要に使用します。 ViewDataは特にビューを変更するためのものです。 提案されているもう1つのオプションは、VMのEventNameを再膨張(再設定)することです。 –

+0

@EliGassertすべての 'ViewData'は、ビューのフィールドをポピュレートしてポストバックします - とにかく隠しフィールドをレンダリングする必要があります。 –

+0

ありがとう@Ant P、私は隠しフィールドに固執すると思います。私は思慮深い説明/理論的根拠に感謝します。 –

関連する問題