2010-02-07 27 views
6

Parece que si sólo utiliza Html.DisplayFor(model => model) sin plantillas para una vista de detalles, el margen de beneficio resultante será algo como esto:Templating Html.DisplayFor() en 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> 

Esto tiene una buen grado de flexibilidad. Si crea clases de CSS para display-label y display-field, puede hacer bastante, pero ¿y si quisiera cambiarlo a algo como esto?

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

Tenga en cuenta que ahora los pares atributo-valor aparecen ahora de lado a lado (en lugar de en líneas separadas) y hay dos puntos después de cada atributo.

¿Hay alguna manera de crear una plantilla personalizada que se repetirá para cada par de atributo-valor cuando se scaffolde una vista de detalles?

No estoy hablando de un modelo específico para un modelo (por ejemplo, una plantilla Person) o una plantilla para una propiedad particular (por ejemplo, una plantilla de EmailAddress). Quiero algo que me permita describir cómo se ve un par de valor de atributo, luego DispalyFor() debería repetir automáticamente esa plantilla para cada propiedad en mi modelo o modelo de vista.

Respuesta

9

¿Qué hay de sobreescribir la plantilla Object, p.

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

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

+0

Esto es exactamente lo que necesitaba. Gracias. – devuxer

+0

Sugiera modificar esto para usar CSS como una pregunta similar http://stackoverflow.com/questions/3055376/style-list-of-divs-as-2-column-layout-with-css – Bermo

Cuestiones relacionadas