Do czego służy składnia @ Html.DisplayFor?

223

Rozumiem, że w Razor @Html robi kilka porządnych rzeczy, takich jak generowanie HTML dla linków, danych wejściowych itp.

Ale nie dostaję funkcji DisplayFor ...

Dlaczego miałbym pisać:

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

kiedy mogłem po prostu napisać:

@Model.Title
Michael Pryor
źródło

Odpowiedzi:

217

Html.DisplayFor() wyrenderuje DisplayTemplate, który pasuje do typu właściwości.

Jeśli nie może znaleźć, to chyba wywołuje .ToString().


Jeśli nie wiesz o szablonach wyświetlania, są to widoki częściowe, które można umieścić w DisplayTemplatesfolderze wewnątrz folderu widoku powiązanego z kontrolerem.


Przykład:

Jeśli utworzysz widok nazwany String.cshtmlw DisplayTemplatesfolderze folderu widoków (np. HomeLub Shared) z następującym kodem:

@model string

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

Następnie @Html.DisplayFor(model => model.Title)(zakładając, że Titlejest to ciąg) użyje szablonu i wyświetli, <strong>Null string</strong>czy ciąg jest pusty lub pusty.

Bertrand Marron
źródło
6
W większości przypadków wydaje mi się bezcelowe używanie DisplayFor dla typów pierwotnych. Na przykład DateTime wyświetli datę / czas, nawet jeśli część czasu była bezużyteczna. Jeśli możesz określić ciąg formatu {0: d} dla typu DateTime w atrybutach właściwości w Modelu, DisplayFor może być bardziej przydatny.
enorl76
6
@ enorl76 możesz. Zobacz odpowiedź Daveo .
Bertrand Marron
3
Możesz dodać selektor daty jQuery do szablonu EditorFor dla typu danych DateTime, aby zawsze pokazywał na przykład selektor daty w formularzach.
Zachary Scott
4
Wydaje mi się, że używanie go ogólnie jest zbyt skomplikowane, ale powinieneś go używać, gdy chcesz sformatować dane wyjściowe dla niektórych atrybutów modelu. Pomocne pytanie i odpowiedź chłopaki, dzięki. +1 dookoła.
Robin Winslow,
co się stanie, jeśli masz dwa modele o tej samej nazwie?
halivingston
77

Myślę, że główną korzyścią byłoby zdefiniowanie własnych szablonów wyświetlania lub użycie adnotacji danych.

Na przykład, jeśli twój tytuł był datą, możesz zdefiniować

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

a następnie na każdej stronie wyświetlałaby wartość w spójny sposób. W przeciwnym razie może być konieczne dostosowanie wyświetlania na wielu stronach. Tak więc nie pomaga wiele dla zwykłych ciągów, ale pomaga walutom, datom, e-mailom, adresom URL itp.

Na przykład zamiast adresu e-mail będącego zwykłym ciągiem, może pojawiać się jako link:

<a href="mailto:@ViewData.Model">@ViewData.TemplateInfo.FormattedModelValue</a>
Daveo
źródło
28

DisplayForjest również przydatny do tworzenia szablonów. Możesz napisać szablon dla swojego modelu i zrobić coś takiego:

@Html.DisplayFor(m => m)

Podobny do @Html.EditorFor(m => m). Jest to użyteczne dla elementu DRY, abyś nie musiał ciągle pisać tej samej logiki wyświetlania dla tego samego modelu.

Spójrz na tego bloga na temat szablonów MVC2. Nadal ma to zastosowanie do MVC3:

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


Jest to również przydatne, jeśli Twój model ma adnotację Dane. Na przykład, jeśli właściwość w modelu jest ozdobiona EmailAddressadnotacją danych, DisplayForrenderuje ją jako mailto:łącze.

vcsjones
źródło
8
@Html.DisplayFor(m => m)można również uprościć do just @Html.DisplayForModel().
Brant Bobby,
Co to jest wyrażenie lamda (m => m)? Jakie jest pierwsze m?
Arcadian
1
pierwszy m to nazwa parametru
Sinaesthetic
1
@ magic-c0d3r pierwsze m to obiekt Model strony. Tego używa się w wyrażeniu labmda
Don Cheadle
4

Po pewnym czasie szukając odpowiedzi, mogłem coś znaleźć. ogólnie, jeśli używamy go tylko do jednej właściwości, wygląda to tak samo, nawet jeśli wykonujemy „Wyświetl źródło” wygenerowanego HTML Poniżej jest generowany HTML, na przykład, gdy chcę wyświetlić tylko właściwość Name dla mojej klasy

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

To jest wygenerowany HTML z poniższego kodu

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

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

Jednocześnie, jeśli chcę wyświetlić wszystkie właściwości w jednej instrukcji dla mojej klasy „Gatunek”, w tym przypadku mogę użyć @ Html.DisplayFor (), aby zaoszczędzić na pisaniu

mogę napisać @ Html.DisplayFor (modelItem => item.Genre) zamiast pisać osobne oświadczenie dla każdej właściwości gatunku, jak poniżej

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

i tak dalej w zależności od liczby właściwości.

Vikas Sharma
źródło