@ Html.DisplayFor sözdizimi ne için?


223

Razor'da @Html'in bağlantılar, girdiler vb. İçin HTML oluşturmak gibi bir sürü düzgün şey yaptığını anlıyorum.

Ancak DisplayFor işlevini alamıyorum ...

Neden yazayım:

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

ne zaman yazabilirim:

@Model.Title

Yanıtlar:


217

Html.DisplayFor() özelliğin türüyle eşleşen DisplayTemplate'i oluşturur.

Eğer bulamazsa, sanırım çağırır .ToString().


Görüntü şablonlarını bilmiyorsanız, bunlar DisplayTemplatesbir denetleyiciyle ilişkilendirilmiş görünüm klasörünün içindeki bir klasöre yerleştirilebilecek kısmi görünümlerdir .


Misal:

Adlı bir görünüm oluşturmak ise String.cshtmliç DisplayTemplates(örneğin klasör görüşlerin klasörüne Homeveya Shared) aşağıdaki kodu:

@model string

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

Daha sonra @Html.DisplayFor(model => model.Title)( Titlebir dize olduğunu varsayarak ) şablonu kullanır ve <strong>Null string</strong>dizenin boş veya boş olduğunu gösterir.


6
Çoğu durumda, ilkel tipler için DisplayFor'u kullanmak bana anlamsız geliyor. Örneğin, DateTime, saat kısmı işe yaramasa bile tarih / saati görüntüler. Modeldeki özelliğin özelliklerinde bir DateTime türü için "{0: d}" biçim dizesi belirtebiliyorsanız, DisplayFor muhtemelen daha yararlı olabilir.
— enorl76

6
@ enorl76 yapabilirsiniz. Daveo'nun cevabına bakın .
— Bertrand Marron

3
Örneğin, tarih formlarında her zaman bir tarih seçici göstermek için bir DateTime veri türü için EditorFor şablonuna bir jQuery tarih seçici ekleyebilirsiniz.
— Zachary Scott

4
Bana genel olarak kullanmak için aşırı mühendislik gibi görünüyor, ancak çıktıyı belirli model nitelikleri için biçimlendirmek istediğinizde kullanmalısınız. Yararlı soru ve cevap çocuklar, teşekkürler. + 1'ler her yerde.
— Robin Winslow

aynı ada sahip iki modeliniz varsa ne olur?
— halivingston

77

Bence asıl yarar, kendi Görüntülü Reklamcılık Şablonlarınızı tanımlamanız veya Veri ek açıklamalarını kullanmanız olacaktır.

Örneğin, başlığınız bir tarihse,

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

ve sonra her sayfada değeri tutarlı bir şekilde gösterir. Aksi takdirde, ekranı birden çok sayfada özelleştirmeniz gerekebilir. Bu yüzden düz dizeler için çok yardımcı olmaz, ancak para birimleri, tarihler, e-postalar, URL'ler vb.

Örneğin, bir e-posta adresinin düz bir dize olması yerine bir bağlantı olarak görünebilir:

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

28

DisplayForayrıca şablonlama için de yararlıdır. Modeliniz için bir şablon yazabilir ve böyle bir şey yapabilirsiniz:

@Html.DisplayFor(m => m)

Benzer @Html.EditorFor(m => m). DRY prensibi için kullanışlıdır, böylece aynı Model için aynı ekran mantığını tekrar tekrar yazmak zorunda kalmazsınız.

MVC2 şablonlarındaki bu bloga bir göz atın. MVC3 için hala çok uygulanabilir:

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


Modelinizde Veri ek açıklaması varsa da yararlıdır. Örneğin, modeldeki özellik EmailAddressveri ek açıklamasıyla süslenmişse , DisplayForbunu bir mailto:bağlantı olarak görüntüler.


8
@Html.DisplayFor(m => m)sadece basitleştirilebilir @Html.DisplayForModel().
— Brant Bobby

Lamda ifadesi nedir (m => m)? İlk m neyi temsil eder?
— Arcadian

1
ilk m parametrenin adıdır
— Sinaesthetic

1
@ magic-c0d3r ilk m sayfanın Model nesnesidir. Labmda ifadesinde kullanılan şey budur
— Don Cheadle

4

Bir süre kendim için bir cevap aradıktan sonra bir şey bulabilirim. genel olarak sadece tek bir özellik için kullanıyorsak, oluşturulan HTML'nin "Kaynağı Görüntüle" yapsak bile aynı görünür.

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

Bu, aşağıdaki koddan oluşturulan HTML'dir

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

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

Aynı zamanda şimdi bu durumda benim sınıf "Tür" için tek bir ifadede tüm özellikleri görüntülemek istiyorsanız, en azından benim yazım kaydetmek için @ Html.DisplayFor () kullanabilirsiniz

Aşağıdaki türün her özelliği için ayrı bir ifade yazmak yerine @ Html.DisplayFor (modelItem => item.Genre) yazabilirim

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

özellik sayısına bağlı olarak.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.