2012-06-15 7 views
27

Ich versuche mich mit MVC4 Razor Füße zu finden und ich bin mit diesem einfachen Problem fest.MVC4 Razor - @ Html.DisplayFür die Bindung an Modell

Wenn ich @ Html.DisplayFor verwenden, wird das Modell immer als NULL zurückgesendet, aber wenn ich @ Html.TextBoxFor dieses Modell verwendet wird vollständig ausgefüllt, was fehlt mir?

Vielen Dank im Voraus

+0

Ich muss die Felder als "Etiketten" anzeigen. Deshalb; Der Zweck dieser Ansicht besteht darin, dem Benutzer zu ermöglichen, die Daten vor dem Senden an die Datenbank anzuzeigen. Irgendwelche Ideen, wie ich das erreichen kann? – Jacques

Antwort

51

Dies ist ein häufiges Problem, dass viele Menschen in dem asp.net MVC-Framework zu verpassen. Nicht nur der Unterschied in den Helfern wie HiddenFor, DisplayFor, TextBoxFor - aber wie genau stellt das Framework automatisch das Sammeln und Validieren dieser Eingaben ein. Die Magie ist alles mit HTML5-Daten-Attribute getan. Sie werden bemerken, wenn Sie das generierte Input-Tag betrachten, dass es einige zusätzliche Eigenschaften in Form von data-val, data-val-required geben wird, und vielleicht einige zusätzliche Dateneigenschaften für Typen, zum Beispiel Numerik wäre data-val-number.

Mit diesen Datenattributen kann die jQuery-Erweiterung jquery.validate.unobtrusive.js das DOM analysieren und anschließend entscheiden, welche Felder validiert oder Fehlermeldungen generiert werden.

Die tatsächliche Sammlung der gebuchten Daten spiegelt sich in der name-Eigenschaft wider. Dies sollte dem Modell in der C# oder vb [HttpPost] Methode entsprechen.

Verwenden Sie HiddenFor, wenn Sie gepostete Daten bereitstellen möchten, die der Benutzer nicht beachten muss.

Verwenden Sie DisplayFor, wenn Sie Datensätze anzeigen, aber nicht bearbeiten möchten.

Verwenden Sie TextBoxFor, wenn Sie Benutzereingaben zulassen oder dem Benutzer das Bearbeiten eines Felds erlauben möchten.

EDIT

"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?"

Man könnte dies mit einem Duo von HiddenFor und DisplayFor erreichen. Verwenden Sie HiddenFor, um die Werte zur Veröffentlichung bereit zu haben, und DisplayFor, um diese Werte anzuzeigen.

+0

Sehr nett von dir. Danke. – mostafakvd

15

DisplayFor wird das Modell nicht verbindlich machen. TextBoxFor wird tun, weil es ein input Element im Formular erstellt und das Formular kann damit umgehen, wenn es gebucht wird. Wenn Sie einige Daten in der HttpPost-Aktion abrufen möchten und Sie die TextBoxFor nicht verwenden möchten, können Sie diese pirticulare Modellproeprty in einer ausgeblendeten Variablen im Formular mithilfe der HTML-Hilfsmethode HiddenFor wie dieser beibehalten.

+0

Hallo Shyju, Ich muss die Felder als "Etiketten" anzeigen. Deshalb; Der Zweck dieser Ansicht besteht darin, dem Benutzer zu ermöglichen, die Daten vor dem Senden an die Datenbank anzuzeigen. Irgendwelche Ideen, wie ich das erreichen kann? – Jacques

+0

! @jacques: Verwenden Sie Displayfor, um die Daten dem Benutzer anzuzeigen, und verwenden Sie HiddenFor, um diese in ausgeblendeten Variablen zu behalten, und Sie sind gut, ein Formular danach zu machen. – Shyju

1

DisplayFor baut ein HTML-Label, keine Eingabe. Labels werden nicht an den Server gesendet, aber Eingaben sind.

0

Meinst du während eines Formulars Post? Wenn Sie DisplayFor verwenden, wird ein Element erstellt, das keine Formularwerte enthält. In der Regel verwenden Sie diese in Verbindung miteinander, um eine Beschriftung für Ihr Textfeld zu erstellen, und verwenden dann Html.TextBoxFor, damit Benutzer das Datenelement ändern können.

Beispiel:

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

rendert

Item <a text input field following> 

oder in HTML

<label for="Item">Item</label><input type="Text" id="Item" name="Item"/> 
5

Verwenden Sie beide DisplayFor und HiddenFor. DisplayFor zeigt einfach den Text an und ist kein Eingabefeld, daher wird es nicht zurückgebucht. HiddenFor erstellt tatsächlich <input type="hidden" value="xxxx"/>

Verwandte Themen