Pergunta

Parece que se você usar apenas Html.DisplayFor(model => model) sem modelos para uma vista de detalhes, a marcação resultante será algo parecido com isto:

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

Isto tem um bom grau de flexibilidade. Se você criar classes CSS para display-label e display-field, você pode fazer um pouco, mas o que se eu queria alterá-lo para algo como isto?

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

Note-se que agora os pares atributo-valor aparece agora lado-a-lado (em vez de em linhas separadas) e não há um cólon após cada atributo.

Existe alguma maneira para criar um modelo personalizado que irá ser repetido para cada par atributo-valor quando uma vista de detalhes é scaffolded?

Eu não estou falando de um modelo específico para um modelo (por exemplo, um modelo Person) ou um modelo para uma propriedade particular (por exemplo, um modelo de EmailAddress). Eu quero algo que apenas deixa-me descrever como um atributo de valor par aparência, então DispalyFor() deve repetir automaticamente esse modelo para cada propriedade no meu modelo ou vista do modelo.

Foi útil?

Solução

Que tal substituir o modelo Object, por exemplo.

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

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

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top