قالب html.displayfor () في ASP.NET MVC 2
-
19-09-2019 - |
سؤال
يبدو أنه إذا كنت تستخدم فقط Html.DisplayFor(model => model)
مع عدم وجود قوالب لعرض تفاصيل، فإن العلامات الناتجة ستبدو شيئا مثل هذا:
<div class="display-label">first name</div>
<div class="display-field">Dan</div>
<div class="display-label">last name</div>
<div class="display-field">M</div>
<div class="display-label">email</div>
<div class="display-field">danm@fakedomain.com</div>
هذا لديه درجة عاادية من المرونة. إذا قمت بإنشاء فئات CSS display-label
و display-field
, ، يمكنك أن تفعل قليلا جدا، ولكن ماذا لو كنت أرغب في تغييره إلى شيء مثل هذا؟
<p>
<span class="display-label">first name</span>:
<span class="display-field">Dan</span>
</p>
<p>
<span class="display-label">last name</span>:
<span class="display-field">M</span>
</p>
<p>
<span class="display-label">email</span>:
<span class="display-field">danm@fakedomain.com</span>
</p>
لاحظ أن أزواج قيمة السمة الآن تظهر الآن جنبا إلى جنب (بدلا من خطوط منفصلة) وهناك قولون بعد كل سمة.
هل هناك أي طريقة لإنشاء قالب مخصص سيتم تكراره لكل زوج قيمة السمة عند عرض تفاصيل سقالة؟
أنا لا أتحدث عن قالب معين لنموذج (على سبيل المثال، أ Person
قالب) أو قالب خاصية معينة (على سبيل المثال، EmailAddress
نموذج). أريد شيئا يتيح لي أن أصف كيف يبدو زوج قيمة السمة، ثم DispalyFor()
يجب تكرار هذا القالب تلقائيا لكل خاصية في النموذج الخاص بي أو عرض النموذج.
المحلول
ماذا عن تجاوز Object
قالب، على سبيل المثال
<%@ Control Language="C#" Inherits="System.Web.Mvc.ViewUserControl" %>
<% if (ViewData.TemplateInfo.TemplateDepth > 3) { %>
<%= ViewData.ModelMetadata.SimpleDisplayText %>
<% } else { %>
<table>
<% foreach (ModelMetadata prop in ViewData.ModelMetadata.Properties.Where(pm => pm.ShowForDisplay && !ViewData.TemplateInfo.Visited(pm))) { %>
<% if (prop.HideSurroundingHtml) { %>
<%= Html.Display(prop.PropertyName) %>
<% } else { %>
<tr>
<td>
<div class="display-label" style="text-align: right;">
<%= Html.Label(prop.PropertyName) %>
</div>
</td>
<td>
<div class="display-field">
<%= Html.Display(prop.PropertyName) %>
<%= Html.ValidationMessage(prop.PropertyName, "*") %>
</div>
</td>
</tr>
<% } %>
<% } %>
</table>
<% } %>