Templat Html.DisplayFor () in ASP.NET MVC 2
-
19-09-2019 - |
Frage
Es scheint, dass, wenn Sie nur Html.DisplayFor(model => model)
ohne Vorlagen für eine Ansicht Details verwenden, die resultierende Markup etwas wie folgt aussehen:
<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>
Das hat ein gewisses Maß an Flexibilität. Wenn Sie CSS-Klassen für display-label
und display-field
erstellen, können Sie ziemlich viel, aber was, wenn ich wollte, dass es so etwas ändern?
<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>
Hinweis, dass jetzt die Attribut-Wert-Paare nun Seite an Seite erscheinen (statt in separaten Zeilen), und es ist ein Doppelpunkt nach jedem Attribute.
Gibt es eine Möglichkeit ein eigenes Template zu erstellen, die für jedes Attribut-Wert-Paar wiederholt werden, wenn ein Detail ansehen rüstet wird?
Ich spreche nicht über eine bestimmte Vorlage für ein Modell (zum Beispiel einer Person
Vorlage) oder eine Vorlage für eine bestimmte Eigenschaft (zum Beispiel einer EmailAddress
Vorlage). Ich möchte etwas, das läßt mich nur beschreiben, wie ein Attribut-Wert-Paar sieht, dann sollte DispalyFor()
automatisch die Vorlage wiederholen Sie für jede Eigenschaft in meinem Modell oder View-Modell.
Lösung
Wie wäre es die Object
Vorlage überschreiben, z.
<%@ 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>
<% } %>