Untuk apa sintaks @ Html.DisplayFor?

223

Saya mengerti bahwa di Razor, @Html melakukan banyak hal yang rapi, seperti menghasilkan HTML untuk tautan, input, dll.

Tapi saya tidak mendapatkan fungsi DisplayFor ...

Mengapa saya menulis:

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

ketika saya bisa menulis:

@Model.Title
Michael Pryor
sumber

Jawaban:

217

Html.DisplayFor() akan menampilkan DisplayTemplate yang cocok dengan tipe properti.

Jika tidak dapat menemukan apapun, saya kira itu memanggil .ToString().


Jika Anda tidak tahu tentang templat tampilan, itu sebagian tampilan yang dapat dimasukkan ke dalam DisplayTemplatesfolder di dalam folder tampilan yang terkait dengan pengontrol.


Contoh:

Jika Anda membuat tampilan bernama String.cshtmldi dalam DisplayTemplatesfolder folder tampilan Anda (misalnya Home, atau Shared) dengan kode berikut:

@model string

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

Kemudian @Html.DisplayFor(model => model.Title)(dengan asumsi itu Titleadalah string) akan menggunakan templat dan tampilan <strong>Null string</strong>jika string tersebut nol, atau kosong.

Bertrand Marron
sumber
6
Tampaknya tidak ada gunanya bagi saya, dalam banyak kasus, menggunakan DisplayFor untuk tipe primitif. Misalnya, DateTime akan menampilkan tanggal / waktu bahkan jika bagian waktu tidak berguna. Jika Anda bisa menentukan string format "{0: d}" untuk tipe DateTime dalam atribut properti pada Model, DisplayFor mungkin bisa lebih berguna.
Enorl76
6
@ enorl76 Anda bisa. Lihat jawaban Daveo .
Bertrand Marron
3
Anda bisa menambahkan pemilih tanggal jQuery ke template EditorFor untuk tipe data DateTime untuk selalu menampilkan pemilih tanggal dalam bentuk misalnya.
Zachary Scott
4
Sepertinya bagi saya itu over-engineering untuk menggunakannya secara umum, tetapi Anda harus menggunakannya ketika Anda ingin memformat output untuk atribut model tertentu. Tanya jawab teman-teman, terima kasih. +1 semua bulat.
Robin Winslow
apa yang terjadi jika Anda memiliki dua model dengan nama yang sama?
halivingston
77

Saya pikir manfaat utamanya adalah ketika Anda menetapkan Templat Display Anda sendiri, atau menggunakan anotasi Data.

Jadi misalnya jika judul Anda adalah tanggal, Anda dapat menentukan

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

dan kemudian pada setiap halaman akan menampilkan nilai secara konsisten. Kalau tidak, Anda mungkin harus menyesuaikan tampilan pada beberapa halaman. Jadi tidak banyak membantu untuk string biasa, tetapi tidak membantu untuk mata uang, tanggal, email, url, dll.

Misalnya, alih-alih alamat email menjadi string biasa, alamat email itu dapat ditampilkan sebagai tautan:

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

DisplayForjuga berguna untuk templating. Anda dapat menulis templat untuk Model Anda, dan melakukan sesuatu seperti ini:

@Html.DisplayFor(m => m)

Mirip dengan @Html.EditorFor(m => m). Ini berguna untuk prinsip KERING sehingga Anda tidak perlu menulis logika tampilan yang sama berulang-ulang untuk Model yang sama.

Lihatlah blog ini di templat MVC2. Itu masih sangat berlaku untuk MVC3:

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


Ini juga berguna jika Model Anda memiliki anotasi Data. Misalnya, jika properti pada model dihiasi dengan EmailAddressanotasi data, DisplayForakan menjadikannya sebagai mailto:tautan.

vcsjones
sumber
8
@Html.DisplayFor(m => m)bisa juga disederhanakan menjadi adil @Html.DisplayForModel().
Brant Bobby
Apa ekspresi lamda (m => m)? Apa yang pertama saya wakili?
Arcadian
1
m pertama adalah nama parameter
Sinaesthetic
1
@ magic-c0d3r m pertama adalah objek Model halaman. Itulah yang digunakan dalam ekspresi labmda
Don Cheadle
4

Setelah mencari jawaban untuk diri sendiri selama beberapa waktu, saya dapat menemukan sesuatu. secara umum jika kita menggunakannya hanya untuk satu properti itu tampak sama bahkan jika kita melakukan "Lihat Sumber" dari HTML yang dihasilkan Di bawah ini dihasilkan HTML misalnya, ketika saya ingin menampilkan hanya properti Nama untuk kelas saya

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

Ini adalah HTML yang dihasilkan dari kode di bawah ini

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

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

Pada saat yang sama sekarang jika saya ingin menampilkan semua properti dalam satu pernyataan untuk "Genre" kelas saya dalam hal ini, saya dapat menggunakan @ Html.DisplayFor () untuk menghemat pengetikan saya, setidaknya

saya dapat menulis @ Html.DisplayFor (modelItem => item.Genre) untuk menulis pernyataan terpisah untuk setiap properti Genre seperti di bawah ini

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

dan seterusnya tergantung pada jumlah properti.

Vikas Sharma
sumber