Wozu dient die @ Html.DisplayFor-Syntax?


223

Ich verstehe, dass @Html in Razor eine Reihe netter Dinge erledigt, wie das Generieren von HTML für Links, Eingaben usw.

Aber ich bekomme die DisplayFor-Funktion nicht ...

Warum sollte ich schreiben:

@Html.DisplayFor(model => model.Title)

als ich nur schreiben konnte:

@Model.Title

Antworten:


217

Html.DisplayFor() rendert die DisplayTemplate, die dem Typ der Eigenschaft entspricht.

Wenn es keine findet, ruft es vermutlich auf .ToString().


Wenn Sie sich mit Anzeigevorlagen nicht auskennen, handelt es sich um Teilansichten, die in einem DisplayTemplatesOrdner innerhalb des einem Controller zugeordneten Ansichtsordners abgelegt werden können.


Beispiel:

Wenn Sie eine Ansicht mit dem folgenden Code String.cshtmlim DisplayTemplatesOrdner Ihres Ansichtsordners (z. B. Homeoder Shared) erstellen:

@model string

@if (string.IsNullOrEmpty(Model)) {
   <strong>Null string</strong>
}
else {
   @Model
}

Dann @Html.DisplayFor(model => model.Title)(vorausgesetzt, es Titlehandelt sich um eine Zeichenfolge) wird die Vorlage verwendet und angezeigt, <strong>Null string</strong>ob die Zeichenfolge null oder leer ist.


6
In den meisten Fällen erscheint es mir sinnlos, DisplayFor für primitive Typen zu verwenden. Beispielsweise würde DateTime Datum / Uhrzeit anzeigen, selbst wenn der Zeitteil unbrauchbar wäre. Wenn Sie eine Formatzeichenfolge "{0: d}" für einen DateTime-Typ in den Attributen der Eigenschaft im Modell angeben könnten, könnte DisplayFor möglicherweise nützlicher sein.
Enorl76

6
@ enorl76 kannst du. Siehe Daveos Antwort .
Bertrand Marron

3
Sie können der EditorFor-Vorlage für einen DateTime-Datentyp eine jQuery-Datumsauswahl hinzufügen, um beispielsweise immer eine Datumsauswahl in Formularen anzuzeigen.
Zachary Scott

4
Es scheint mir, als wäre es übertrieben, es im Allgemeinen zu verwenden, aber Sie sollten es verwenden, wenn Sie die Ausgabe für bestimmte Modellattribute formatieren möchten. Hilfreiche Fragen und Antworten Jungs, danke. + 1s rundum.
Robin Winslow

Was passiert, wenn Sie zwei Modelle mit demselben Namen haben?
Halivingston

77

Ich denke, der Hauptvorteil wäre, wenn Sie Ihre eigenen Anzeigevorlagen definieren oder Datenanmerkungen verwenden.

Wenn Ihr Titel beispielsweise ein Datum war, können Sie ihn definieren

[DisplayFormat(DataFormatString = "{0:d}")]

und dann würde auf jeder Seite der Wert auf konsistente Weise angezeigt. Andernfalls müssen Sie möglicherweise die Anzeige auf mehreren Seiten anpassen. Es hilft also nicht viel für einfache Zeichenfolgen, aber es hilft für Währungen, Daten, E-Mails, URLs usw.

Beispielsweise könnte eine E-Mail-Adresse anstelle einer einfachen Zeichenfolge als Link angezeigt werden:

<a href="mailto:@ViewData.Model">@ViewData.TemplateInfo.FormattedModelValue</a>

28

DisplayForist auch nützlich für Vorlagen. Sie könnten eine Vorlage für Ihr Modell schreiben und Folgendes tun:

@Html.DisplayFor(m => m)

Ähnlich wie @Html.EditorFor(m => m). Dies ist nützlich für das DRY-Prinzip, damit Sie nicht immer wieder dieselbe Anzeigelogik für dasselbe Modell schreiben müssen.

Schauen Sie sich diesen Blog über MVC2-Vorlagen an. Es ist immer noch sehr gut auf MVC3 anwendbar:

http://www.dalsoft.co.uk/blog/index.php/2010/04/26/mvc-2-templates/


Dies ist auch nützlich, wenn Ihr Modell über eine Datenanmerkung verfügt. Wenn die Eigenschaft des Modells beispielsweise mit der EmailAddressDatenanmerkung versehen ist, DisplayForwird sie als mailto:Link gerendert.


8
@Html.DisplayFor(m => m)kann auch einfach vereinfacht werden @Html.DisplayForModel().
Brant Bobby

Was ist der Lamda-Ausdruck (m => m)? Was ist das erste m darstellen?
Arcadian

1
Das erste m ist der Name des Parameters
Sinaesthetic

1
@ magic-c0d3r Das erste m ist das Modellobjekt der Seite. Das ist, was im labmda Ausdruck verwendet wird
Don Cheadle

4

Nachdem ich einige Zeit nach einer Antwort für mich gesucht hatte, konnte ich etwas finden. Wenn wir es nur für eine Eigenschaft verwenden, wird es im Allgemeinen auch dann angezeigt, wenn wir eine "Ansichtsquelle" für generierten HTML-Code erstellen. Im Folgenden wird beispielsweise HTML generiert, wenn ich nur die Name-Eigenschaft für meine Klasse anzeigen möchte

    <td>
    myClassNameProperty
    </td>
   <td>
    myClassNameProperty, This is direct from Item
    </td>

Dies ist der generierte HTML-Code aus dem folgenden Code

<td>
@Html.DisplayFor(modelItem=>item.Genre.Name)            
</td>

<td>
@item.Genre.Name, This is direct from Item
</td>

Zur gleichen Zeit, wenn ich in diesem Fall alle Eigenschaften in einer Anweisung für meine Klasse "Genre" anzeigen möchte, kann ich zumindest @ Html.DisplayFor () verwenden, um meine Eingabe zu speichern

Ich kann @ Html.DisplayFor (modelItem => item.Genre) schreiben, anstatt eine separate Anweisung für jede Eigenschaft von Genre wie unten zu schreiben

@item.Genre.Name
@item.Genre.Id
@item.Genre.Description

und so weiter abhängig von der Anzahl der Eigenschaften.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.