Cú pháp @ Html.DisplayFor dùng để làm gì?


223

Tôi hiểu rằng trong Dao cạo, @Html thực hiện rất nhiều thứ gọn gàng, như tạo HTML cho các liên kết, đầu vào, v.v.

Nhưng tôi không có chức năng DisplayFor ...

Tại sao tôi lại viết:

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

khi tôi chỉ có thể viết:

@Model.Title

Câu trả lời:


217

Html.DisplayFor() sẽ hiển thị DisplayTemplate phù hợp với loại của thuộc tính.

Nếu nó không thể tìm thấy bất kỳ, tôi cho rằng nó gọi .ToString().


Nếu bạn không biết về các mẫu hiển thị, chúng là các chế độ xem một phần có thể được đặt trong một DisplayTemplatesthư mục bên trong thư mục xem được liên kết với bộ điều khiển.


Thí dụ:

Nếu bạn tạo chế độ xem được đặt tên String.cshtmltrong DisplayTemplatesthư mục của thư mục chế độ xem (ví dụ: Homehoặc Shared) với mã sau:

@model string

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

Sau đó @Html.DisplayFor(model => model.Title)(giả sử đó Titlelà một chuỗi) sẽ sử dụng mẫu và hiển thị <strong>Null string</strong>nếu chuỗi đó là null hoặc trống.


6
Trong hầu hết các trường hợp, dường như vô nghĩa đối với tôi khi sử dụng DisplayFor cho các kiểu nguyên thủy. Ví dụ: DateTime sẽ hiển thị ngày / giờ ngay cả khi phần thời gian là vô ích. Nếu bạn có thể chỉ định chuỗi định dạng "{0: d}" cho loại DateTime trong thuộc tính của thuộc tính trên Model, DisplayFor có thể hữu ích hơn.
enorl76

6
@ enorl76 bạn có thể. Xem câu trả lời của Dave .
Bertrand Marron

3
Bạn có thể thêm trình chọn ngày jQuery vào mẫu EditorFor cho kiểu dữ liệu DateTime để luôn hiển thị trình chọn ngày trong các biểu mẫu chẳng hạn.
Zachary Scott

4
Đối với tôi có vẻ như nó quá kỹ thuật để sử dụng nó nói chung, nhưng bạn nên sử dụng nó khi bạn muốn định dạng đầu ra cho các thuộc tính mô hình nhất định. Câu hỏi hữu ích và trả lời kẻ, cảm ơn. + 1s tất cả các vòng.
Robin Winslow

Điều gì xảy ra nếu bạn có hai mô hình có cùng tên?
halivingston

77

Tôi nghĩ lợi ích chính sẽ là khi bạn xác định Mẫu hiển thị của riêng mình hoặc sử dụng chú thích dữ liệu.

Vì vậy, ví dụ nếu tiêu đề của bạn là một ngày, bạn có thể xác định

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

và sau đó trên mỗi trang, nó sẽ hiển thị giá trị một cách nhất quán. Nếu không, bạn có thể phải tùy chỉnh màn hình trên nhiều trang. Vì vậy, nó không giúp ích nhiều cho các chuỗi đơn giản, nhưng nó giúp ích cho các loại tiền tệ, ngày tháng, email, url, v.v.

Ví dụ: thay vì một địa chỉ email là một chuỗi đơn giản, nó có thể hiển thị dưới dạng một liên kết:

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

28

DisplayForcũng hữu ích cho templating. Bạn có thể viết một mẫu cho Mô hình của bạn và làm một cái gì đó như thế này:

@Html.DisplayFor(m => m)

Tương tự như @Html.EditorFor(m => m). Nó hữu ích cho hiệu trưởng DRY để bạn không phải viết cùng một logic hiển thị cho cùng một Mô hình.

Hãy xem blog này trên các mẫu MVC2. Nó vẫn rất phù hợp với MVC3:

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


Nó cũng hữu ích nếu Mô hình của bạn có chú thích dữ liệu. Chẳng hạn, nếu thuộc tính trên mô hình được trang trí với EmailAddresschú thích dữ liệu, DisplayForsẽ hiển thị nó dưới dạng một mailto:liên kết.


8
@Html.DisplayFor(m => m)cũng có thể được đơn giản hóa để chỉ @Html.DisplayForModel().
Brant Bobby

Biểu thức lamda (m => m) là gì? M đầu tiên đại diện là gì?
Arcadian

1
m đầu tiên là tên của tham số
Sinaological

1
@ magic-c0d3r m đầu tiên là đối tượng Model của trang. Đó là những gì được sử dụng trong biểu thức labmda
Don Cheadle

4

Sau khi tìm kiếm một câu trả lời cho bản thân mình một thời gian, tôi có thể tìm thấy một cái gì đó. nói chung nếu chúng ta đang sử dụng nó cho chỉ một thuộc tính thì nó xuất hiện giống nhau ngay cả khi chúng ta thực hiện "Xem nguồn" của HTML được tạo Dưới đây là HTML được tạo, ví dụ khi tôi muốn chỉ hiển thị thuộc tính Tên cho lớp của mình

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

Đây là HTML được tạo từ mã bên dưới

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

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

Đồng thời bây giờ nếu tôi muốn hiển thị tất cả các thuộc tính trong một câu lệnh cho lớp "Thể loại" của mình trong trường hợp này, tôi có thể sử dụng @ Html.DisplayFor () để lưu vào cách gõ của mình, ít nhất là

tôi có thể viết @ Html.DisplayFor (modelItem => item.Genre) thay cho việc viết một tuyên bố riêng cho từng thuộc tính của Thể loại như dưới đây

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

và như vậy tùy thuộc vào số lượng tài sản.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.