35

私はMVC4Razorで自分の足を見つけようとしていますが、この単純な問題で立ち往生しています。

@ Html.DisplayForを使用すると、モデルは常にNULLとして返送されますが、@ Html.TextBoxForを使用すると、このモデルは完全に入力されますが、何が欠けていますか?

前もって感謝します

4

6 に答える 6

63

これは、asp.net mvc フレームワークで多くの人が見逃している一般的な問題です。HiddenForDisplayFor、 -などのヘルパーの違いだけでなくTextBoxFor、フレームワークがこれらの入力を自動的に収集して検証する方法を正確に設定します。魔法はすべて HTML5 の data-* 属性で行われます。生成された入力タグを見ると、 、 の形式でいくつかの追加のプロパティがあることに気付くdata-valでしょう。data-val-requiredまた、おそらく数値型の追加のデータ プロパティがいくつかあることに気付くでしょうdata-val-number

これらのデータ属性により、jQuery 拡張機能jquery.validate.unobtrusive.jsは DOM を解析し、検証またはエラー メッセージを生成するフィールドを決定できます。

投稿されたデータの実際のコレクションは、nameプロパティから反映されます。これは、c# または vb[HttpPost]メソッドにあるモデルにマップする必要があるものです。

HiddenForユーザーが意識する必要のない投稿データを提供したい場合に使用します。

DisplayForレコードを表示したいが編集は許可したくない場合に使用します。

TextBoxForユーザー入力を許可する場合、またはユーザーがフィールドを編集できるようにする場合に使用します。

編集

"the purpose of this view is to enable the user to view the data before submitting it to the database. Any ideas how I can achieve this?"

HiddenForとのデュオでこれを実現できDisplayForます。HiddenFor値をポストする準備を整え、それらの値を表示するために使用しDisplayForます。

于 2012-06-15T19:34:50.147 に答える
16

DisplayForモデルバインディングを行いません。TextBoxForフォームに要素を作成し、input投稿時にフォームがそれを処理できるためです。HttpPost アクションでデータを取得したいが、TextBoxFor を使用したくない場合は、HiddenForこのような HTML ヘルパー メソッドを使用して、フォーム内の隠し変数にその pirticulare モデル プロパティを保持できます。

@using(Html.BeginForm())
{
  <p>The Type Name is</p> @Html.DisplayFor(x=>x.TypeName)
  @Html.HiddenFor(x=>x.TypeName)
  <input type="submit" value="Save" />
}
于 2012-06-15T19:27:36.780 に答える
6

との両方DisplayForを使用しHiddenForます。DisplayFor単にテキストを表示するだけで、入力フィールドではないため、ポストバックされません。 HiddenFor実際に作成します<input type="hidden" value="xxxx"/>

于 2012-08-02T04:23:52.930 に答える
2

DisplayFor入力ではなく、HTML ラベルを作成します。ラベルはサーバーに POST されませんが、入力は POST されます。

于 2012-06-15T19:27:37.203 に答える
0

フォーム投稿中ということですか?DisplayFor を使用すると、フォーム値を含まない要素が作成されます。通常、これらを組み合わせて使用​​してテキスト ボックスのラベルを作成し、Html.TextBoxFor を使用してユーザーがデータ要素を変更できるようにします。

例:

@Html.DisplayFor(x=>x.Item)
@Html.TextBoxFor(x=>x.Item)

レンダリングします

Item <a text input field following>

またはHTMLで

<label for="Item">Item</label><input type="Text" id="Item" name="Item"/>
于 2012-06-15T19:28:28.323 に答える