看来,如果您只使用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>
这具有相当程度的灵活性。如果你为display-label
和display-field
创建CSS类,你可以做很多,但是如果我想把它改成这样的话呢?
<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()
应该自动为模型或视图模型中的每个属性重复该模板。
答案 0 :(得分:9)
覆盖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>
<% } %>