@ 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.cshtmlDisplayTemplates(ö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.