2011-12-20 11 views
6

Esiste un modo più intelligente di mostrare/nascondere gli elementi in modo condizionale (con il rasoio) rispetto a questo di seguito? La vista è molto grande e io sono preoccupato per la manutenzione:Elementi di visualizzazione condizionale 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> 
} 

Grazie, Hoisel

risposta

7

Si potrebbe scrivere un aiutante personalizzato che condizionalmente uscita il contenuto:

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); 
    } 
} 

e poi :

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

Un'altra possibilità è utilizzare un di modello splay:

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

Quindi è possibile definire una maschera di visualizzazione per il tipo di stringa (o uno personalizzato):

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

e del modello di visualizzazione:

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

E ' non il lavoro della vista per gestire la logica del modello. Spostare quella logica nel controller appropriato.

Una cosa da considerare se la vista sta iniziando a essere troppo grande, iniziare a fare viste parziali. Forse un po 'di codice può essere riutilizzato.

2

Si potrebbe redude il codice in voi visualizzare facendo refactoring parte del codice in questo 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. 
} 

ho intuito il tipo di prazosEEntregas nel codice, potrebbe essere necessario sostituire quella con il tipo corretto .

Problemi correlati