2010-02-07 8 views
6

Es scheint, dass, wenn Sie nur Html.DisplayFor(model => model) für eine Ansicht Details ohne Vorlagen verwenden, die resultierende Markup etwas wie folgt aussehen:Templating Html.DisplayFor() in ASP.NET MVC 2

<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">[email protected]</div> 

Dieses a hat fairer Grad an Flexibilität. Wenn Sie CSS-Klassen für display-label und display-field erstellen, können Sie einiges tun, aber was, wenn ich es in etwas wie das ändern wollte?

<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">[email protected]</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, eine benutzerdefinierte Vorlage zu erstellen, die für jedes Attribut-Wert-Paar wiederholt wird, wenn eine Detailansicht gerüstet ist?

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, mit dem ich nur beschreiben kann, wie ein Attribut-Wert-Paar aussieht, und dann sollte diese Vorlage automatisch für jede Eigenschaft in meinem Modell oder Ansichtsmodell wiederholt werden (DispalyFor()).

Antwort

9

Wie überschreiben Sie die Object Vorlage, 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

+0

Das ist genau das, was ich brauchte. Vielen Dank. – devuxer

+0

Schlagen Sie vor, dies zu ändern, um CSS wie eine ähnliche Frage zu verwenden http://stackoverflow.com/questions/3055376/style-list-of-divs-as-2-column-layout-with-css – Bermo