2010-02-07 4 views
6

Sembra che se si utilizza Html.DisplayFor(model => model) senza modelli per una vista dettagli, il markup risultante sarà simile a questa: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> 

Questo ha un buon grado di flessibilità. Se crei classi CSS per display-label e display-field, puoi fare un bel po 'di tempo, ma se volessi cambiarlo in qualcosa di simile?

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

noti che ora le coppie attributo-valore appaiono ora side-by-side (anziché su linee separate) e c'è un colon dopo ogni attributo.

C'è un modo per creare un modello personalizzato che verrà ripetuto per ogni coppia valore-attributo quando una vista dettagli è impalcata?

Non sto parlando di un modello specifico per un modello (ad esempio, un modello Person) o un modello per una particolare proprietà (ad esempio, un modello EmailAddress). Voglio qualcosa che mi permetta di descrivere come appare una coppia valore-attributo, quindi DispalyFor() dovrebbe ripetere automaticamente quel modello per ogni proprietà nel mio modello o modello di vista.

risposta

9

Come annullare il modello Object, ad es.

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

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

+0

Questo è esattamente quello che mi serviva. Grazie. – devuxer

+0

Suggerisci di modificare questo per usare CSS come una domanda simile http://stackoverflow.com/questions/3055376/style-list-of-divs-as-2-column-layout-with-css – Bermo