ฉันเข้าใจว่าในมีดโกน @Html จะทำสิ่งต่าง ๆ ที่เป็นระเบียบเช่นสร้าง HTML สำหรับลิงก์ลิงก์อินพุต ฯลฯ
แต่ฉันไม่ได้รับฟังก์ชั่น DisplayFor ...
ทำไมฉันถึงเขียน:
@Html.DisplayFor(model => model.Title)
เมื่อฉันสามารถเขียนได้:
@Model.Title
ฉันเข้าใจว่าในมีดโกน @Html จะทำสิ่งต่าง ๆ ที่เป็นระเบียบเช่นสร้าง HTML สำหรับลิงก์ลิงก์อินพุต ฯลฯ
แต่ฉันไม่ได้รับฟังก์ชั่น DisplayFor ...
ทำไมฉันถึงเขียน:
@Html.DisplayFor(model => model.Title)
เมื่อฉันสามารถเขียนได้:
@Model.Title
คำตอบ:
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>
ว่าสตริงนั้นเป็นโมฆะหรือว่างเปล่า
ฉันคิดว่าประโยชน์หลักจะเกิดขึ้นเมื่อคุณกำหนดเทมเพลตการแสดงผลของคุณเองหรือใช้คำอธิบายประกอบข้อมูล
ตัวอย่างเช่นหากชื่อของคุณเป็นวันที่คุณสามารถกำหนดได้
[DisplayFormat(DataFormatString = "{0:d}")]
แล้วทุกหน้ามันจะแสดงค่าในลักษณะที่สอดคล้องกัน มิฉะนั้นคุณอาจต้องปรับแต่งการแสดงผลในหลาย ๆ หน้า ดังนั้นมันจึงไม่ได้ช่วยอะไรมากนักสำหรับสตริงธรรมดา แต่มันช่วยได้กับสกุลเงิน, วันที่, อีเมล์, URL ฯลฯ
ตัวอย่างเช่นแทนที่จะเป็นที่อยู่อีเมลเป็นสตริงธรรมดามันสามารถแสดงเป็นลิงค์:
<a href="mailto:@ViewData.Model">@ViewData.TemplateInfo.FormattedModelValue</a>
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:
ลิงก์
@Html.DisplayFor(m => m)
@Html.DisplayForModel()
นอกจากนี้ยังสามารถง่ายเพียงแค่
หลังจากมองหาคำตอบด้วยตัวเองสักพักฉันก็หาบางอย่างได้ โดยทั่วไปถ้าเราใช้มันสำหรับคุณสมบัติเดียวมันจะเหมือนกันแม้ว่าเราจะทำ "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
และอื่น ๆ ขึ้นอยู่กับจำนวนของคุณสมบัติ