Templates Html.DisplayFor () no ASP.NET MVC 2
-
19-09-2019 - |
Pergunta
Parece que se você usar apenas Html.DisplayFor(model => model)
sem modelos para uma vista de detalhes, a marcação resultante será algo parecido com isto:
<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>
Isto tem um bom grau de flexibilidade. Se você criar classes CSS para display-label
e display-field
, você pode fazer um pouco, mas o que se eu queria alterá-lo para algo como isto?
<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>
Note-se que agora os pares atributo-valor aparece agora lado-a-lado (em vez de em linhas separadas) e não há um cólon após cada atributo.
Existe alguma maneira para criar um modelo personalizado que irá ser repetido para cada par atributo-valor quando uma vista de detalhes é scaffolded?
Eu não estou falando de um modelo específico para um modelo (por exemplo, um modelo Person
) ou um modelo para uma propriedade particular (por exemplo, um modelo de EmailAddress
). Eu quero algo que apenas deixa-me descrever como um atributo de valor par aparência, então DispalyFor()
deve repetir automaticamente esse modelo para cada propriedade no meu modelo ou vista do modelo.
Solução
Que tal substituir o modelo Object
, por exemplo.
<%@ 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>
<% } %>