ไวยากรณ์ @ Html.DisplayFor มีไว้เพื่ออะไร


223

ฉันเข้าใจว่าในมีดโกน @Html จะทำสิ่งต่าง ๆ ที่เป็นระเบียบเช่นสร้าง HTML สำหรับลิงก์ลิงก์อินพุต ฯลฯ

แต่ฉันไม่ได้รับฟังก์ชั่น DisplayFor ...

ทำไมฉันถึงเขียน:

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

เมื่อฉันสามารถเขียนได้:

@Model.Title

คำตอบ:


217

Html.DisplayFor() จะแสดง DisplayTemplate ที่ตรงกับประเภทของคุณสมบัติ

ถ้ามันไม่สามารถหาใด ๆ .ToString()ฉันคิดว่ามันจะเรียก


หากคุณไม่ทราบเกี่ยวกับเทมเพลตการแสดงผลมุมมองบางส่วนนั้นสามารถใส่ไว้ในDisplayTemplatesโฟลเดอร์ภายในโฟลเดอร์มุมมองที่เกี่ยวข้องกับคอนโทรลเลอร์


ตัวอย่าง:

หากคุณสร้างมุมมองที่มีชื่อString.cshtmlอยู่ในDisplayTemplatesโฟลเดอร์ของโฟลเดอร์มุมมองของคุณ (เช่นHomeหรือShared) ด้วยรหัสต่อไปนี้:

@model string

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

จากนั้น@Html.DisplayFor(model => model.Title)(สมมติว่าTitleเป็นสตริง) จะใช้เทมเพลตและแสดง<strong>Null string</strong>ว่าสตริงนั้นเป็นโมฆะหรือว่างเปล่า


6
ดูเหมือนว่าไม่มีประโยชน์กับฉันในกรณีส่วนใหญ่การใช้ DisplayFor สำหรับประเภทดั้งเดิม ตัวอย่างเช่น DateTime จะแสดงวันที่ / เวลาแม้ว่าส่วนเวลาจะไร้ประโยชน์ หากคุณสามารถระบุสตริงรูปแบบเป็น "{0: d}" สำหรับประเภท DateTime ในคุณสมบัติของคุณสมบัติใน Model, DisplayFor อาจมีประโยชน์มากกว่า
enorl76

6
@ enorl76 คุณสามารถ ดูคำตอบของ Daveo
Bertrand Marron

3
คุณสามารถเพิ่มตัวเลือกวันที่ jQuery ให้กับเทมเพลต EditorFor สำหรับประเภทข้อมูล DateTime เพื่อแสดงตัวใช้เลือกวันที่ในรูปแบบเสมอ
Zachary Scott

4
ดูเหมือนว่าฉันชอบมันเกินความเป็นจริงที่จะใช้มันโดยทั่วไป แต่คุณควรใช้มันเมื่อคุณต้องการจัดรูปแบบเอาต์พุตสำหรับแอตทริบิวต์ของโมเดลบางอย่าง คำถามและคำตอบที่เป็นประโยชน์ขอบคุณ +1 ทุกรอบ
Robin Winslow

จะเกิดอะไรขึ้นถ้าคุณมีสองรุ่นที่มีชื่อเดียวกัน
halivingston

77

ฉันคิดว่าประโยชน์หลักจะเกิดขึ้นเมื่อคุณกำหนดเทมเพลตการแสดงผลของคุณเองหรือใช้คำอธิบายประกอบข้อมูล

ตัวอย่างเช่นหากชื่อของคุณเป็นวันที่คุณสามารถกำหนดได้

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

แล้วทุกหน้ามันจะแสดงค่าในลักษณะที่สอดคล้องกัน มิฉะนั้นคุณอาจต้องปรับแต่งการแสดงผลในหลาย ๆ หน้า ดังนั้นมันจึงไม่ได้ช่วยอะไรมากนักสำหรับสตริงธรรมดา แต่มันช่วยได้กับสกุลเงิน, วันที่, อีเมล์, URL ฯลฯ

ตัวอย่างเช่นแทนที่จะเป็นที่อยู่อีเมลเป็นสตริงธรรมดามันสามารถแสดงเป็นลิงค์:

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

28

DisplayForยังมีประโยชน์สำหรับการสร้างเทมเพลต คุณสามารถเขียนเทมเพลตสำหรับโมเดลของคุณและทำสิ่งนี้:

@Html.DisplayFor(m => m)

@Html.EditorFor(m => m)จะคล้ายกัน มันมีประโยชน์สำหรับหลักการ DRY เพื่อที่คุณจะได้ไม่ต้องเขียนตรรกะการแสดงผลเดียวกันซ้ำแล้วซ้ำอีกสำหรับรุ่นเดียวกัน

ดูบล็อกนี้ในเทมเพลต MVC2 มันยังคงใช้งานได้ดีกับ MVC3:

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


นอกจากนี้ยังมีประโยชน์หากรุ่นของคุณมีคำอธิบายประกอบข้อมูล ตัวอย่างเช่นถ้าคุณสมบัติของแบบจำลองถูกตกแต่งด้วยEmailAddressหมายเหตุประกอบข้อมูลDisplayForจะแสดงผลเป็นmailto:ลิงก์


8
@Html.DisplayFor(m => m)@Html.DisplayForModel()นอกจากนี้ยังสามารถง่ายเพียงแค่
Brant Bobby

นิพจน์ lamda คืออะไร (m => m) m ตัวแรกคืออะไร?
Arcadian

1
m ตัวแรกคือชื่อของพารามิเตอร์
Sinaesthetic

1
@ magic-c0d3r m แรกคือวัตถุ Model ของหน้า นั่นคือสิ่งที่ใช้ในการแสดงออก labmda
Don Cheadle

4

หลังจากมองหาคำตอบด้วยตัวเองสักพักฉันก็หาบางอย่างได้ โดยทั่วไปถ้าเราใช้มันสำหรับคุณสมบัติเดียวมันจะเหมือนกันแม้ว่าเราจะทำ "View Source" ของ HTML ที่สร้างขึ้นด้านล่างนี้ถูกสร้างขึ้น HTML เช่นเมื่อฉันต้องการแสดงเฉพาะคุณสมบัติ Name สำหรับชั้นเรียนของฉัน

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

นี่คือ HTML ที่สร้างขึ้นจากรหัสด้านล่าง

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

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

ในขณะเดียวกันถ้าฉันต้องการแสดงคุณสมบัติทั้งหมดในหนึ่งคำสั่งสำหรับคลาส "ประเภท" ของฉันในกรณีนี้ฉันสามารถใช้ @ Html.DisplayFor () เพื่อบันทึกการพิมพ์ของฉันอย่างน้อย

ฉันสามารถเขียน @ Html.DisplayFor (modelItem => item.Genre) แทนการเขียนคำสั่งแยกต่างหากสำหรับแต่ละคุณสมบัติของประเภทดังนี้

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

และอื่น ๆ ขึ้นอยู่กับจำนวนของคุณสมบัติ

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.