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.

War es hilfreich?

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>
    <% } %>

Siehe http://bradwilson.typepad.com/blog/2009/10/aspnet-mvc-2-templates-part-4-custom-object-templates.html

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top