2011-12-20 15 views
6

¿Existe alguna manera más inteligente de mostrar/ocultar elementos condicionalmente (con rasuradora) que a continuación? La vista es muy grande y estoy preocupado por el mantenimiento:Elementos de visualización condicionales con Razor

@if(@Model.Atendimento.PrazosEEntregas.Visivel) 
{ 
    <div> 
     <h4>Prazos e entrega do serviço</h4> 

     @if (!string.IsNullOrWhiteSpace(@Model.Atendimento.PrazosEEntregas.PrazoFinalizacaoServico)) 
     { 
      <p>@Model.Atendimento.PrazosEEntregas.PrazoFinalizacaoServico</p> 
     } 

     @if (!string.IsNullOrWhiteSpace(@Model.Atendimento.PrazosEEntregas.PrazoRetiradaDocumento)) 
     { 
      <p><strong>Prazo de retirar o documento:</strong> @Model.Atendimento.PrazosEEntregas.PrazoRetiradaDocumento</p> 
     } 

     @if (!string.IsNullOrWhiteSpace(@Model.Atendimento.PrazosEEntregas.OndeRetirarServico)) 
     { 
      <p><strong>Onde retirar/receber:</strong> @Model.Atendimento.PrazosEEntregas.OndeRetirarServico</p> 
     } 

     @if (!string.IsNullOrWhiteSpace(@Model.Atendimento.PrazosEEntregas.ObservacaoPrazoRetirada)) 
     { 
      <p><strong>Observação:</strong> @Model.Atendimento.PrazosEEntregas.ObservacaoPrazoRetirada</p> 
     } 
    </div> 
} 

Gracias, Hoisel

Respuesta

7

Se podría escribir un ayudante personalizado que lo hará de forma condicional de salida de los contenidos:

public static class HtmlExtensions 
{ 
    public static IHtmlString FormatValue(
     this HtmlHelper htmlHelper, 
     string value, 
     string label 
    ) 
    { 
     if (string.IsNullOrWhiteSpace(value)) 
     { 
      return MvcHtmlString.Empty; 
     } 

     var result = string.Format(
      "<p><strong>{0}</strong> {1}</p>", 
      htmlHelper.Encode(label), 
      htmlHelper.Encode(value) 
     ); 
     return new HtmlString(value); 
    } 
} 

y luego :

@Html.FormatValue(
    Model.Atendimento.PrazosEEntregas.ObservacaoPrazoRetirada, 
    "Observação:" 
) 

Otra posibilidad es utilizar un di plantilla de ensanchamiento:

@Html.DisplayFor(x => x.Atendimento.PrazosEEntregas.ObservacaoPrazoRetirada) 

A continuación, se puede definir una plantilla de visualización para el tipo de cadena (o uno personalizado):

@model string 
@if (!string.IsNullOrWhiteSpace(Model)) 
{ 
    <p> 
     <strong>@ViewData.ModelMetadata.DisplayName</strong> 
     @ViewData.TemplateInfo.FormattedModelValue 
    </p> 
} 

y en su modelo de vista:

[DisplayName("Observação:")] 
[UIHint("MyTemplate")] 
public string ObservacaoPrazoRetirada { get; set; } 
0

Es no es el trabajo de la vista para manejar la lógica del modelo. Mueve esa lógica al controlador apropiado.

Una cosa a considerar si su vista está comenzando a ser demasiado grande, comience a hacer vistas parciales. Tal vez algún código puede ser reutilizado.

2

Se podría redude el código en que la vista por refactorización una parte del código de este modo:

<h4>Prazos e entrega do serviço</h4> 

@{ PrazosEEntregas prazosEEntregas = Model.Atendimento.PrazosEEntregas; } 

@if (!string.IsNullOrWhiteSpace(prazosEEntregas.PrazoFinalizacaoServico)) 
{ 
    <p>prazosEEntregas.PrazoFinalizacaoServico</p> 
} 
@if (!string.IsNullOrWhiteSpace(prazosEEntregas.PrazoRetiradaDocumento)) 
{ 
    //etc. 
} 

he adivinado en el tipo de prazosEEntregas en su código, puede que tenga que sustituir que con el tipo correcto .