Domanda

Mi stavo chiedendo, se spostando complesso se else e la conseguente markup html il codice dietro viola un po 'di MVC' legge?

Mi sembra una grande opzione quando si è di fronte con inline se else che possono diventare estremamente leggibile.

È stato utile?

Soluzione

Io preferisco non utilizzare il codice sottostante in classe il mio punto di vista.Questo non è perché viola MVC per impostazione predefinita, ma perché ho scoperto che il modo "naturale" (almeno per me) è diverso.

Quando mi volto complesso di markup HTML che si riferisce alla sola vista di preoccupazioni, di solito scrivo un metodo di estensione per HtmlHelper classe, al fine di nascondere la complessità.Così ho estensioni come Html.MoneyTextBox(), Html.OptionGroup() e Html.Pager<T>.

In altri casi, quando le condizioni complesse derivano, di solito mi sono perso qualcosa dal controller.Per esempio, tutti i problemi legati alla visibilità, di sola lettura o permesso di elementi di solito derivano da qualcosa che il controllore è in grado di fornire.In questo caso invece di passare il modello per la vista, ho deciso di creare un modello di visualizzazione che incapsula il modello e le ulteriori informazioni che il controllore è in grado di fornire al fine di semplificare il linguaggio di markup HTML.Un tipico esempio di visualizzazione del modello è la seguente:

public class CustomerInfo
{
  public Customer Customer { get; set; }
  public bool IsEditable { get; set; }  // e.g. based on current user/role
  public bool NeedFullAddress { get; set; }  // e.g. based on requested action 
  public bool IsEligibleForSomething { get; set; }  // e.g. based on business rule
} 

Detto questo, il codice è parte della vista, in modo che si può utilizzare liberamente, se si adatta alle vostre esigenze meglio.

Altri suggerimenti

Non è orribile avere condizionali in vista.Vorrei tenerli in ASPX non il codice dietro.Tuttavia, un condizionale indica spesso controllo del comportamento.Si consideri il seguente codice ASPX:

<%if (ViewData["something"] == "foo") {%>
     <%=Html.ActionLink("Save", "Save") %> 
<%}%>
<%if (ViewData["somethingElse"] == "bar") {%>
     <%=Html.ActionLink("Delete", "Delete") %> 
<%}%>

Questo set di istruzioni condizionali rappresenta il controllo del comportamento che viene gestito da vista -- cioè, nel posto sbagliato.Questo comportamento non è unità testabili.Invece considerare:

<%foreach (var command in (IList<ICommand>)ViewData["commands"]) {%>
     <%=Html.ActionLink(command) %>
<%}%>

In questo esempio ActionLink è un'estensione personalizzata di HtmlHelper che prende la nostra ICommand oggetto specifica.Il controller di azione che rende questo punto di vista popola ViewData["comandi"] sulla base di diverse condizioni.In altre parole, il controller si occupa di controllo di gestione.In i test per le unità di questa azione, si può verificare che il corretto set di comandi sarà presentato in varie condizioni.

A prima vista questa potrebbe sembrare una seccatura rispetto rapidamente lanciando un paio di IFs in vista.La domanda da porsi è: "Non questo SE rappresentano controllo del comportamento, e non voglio essere sicuro di non, a un certo punto si rompe?"

Io credo che finchè si tratta di un codice di rendering e "Vista", non in un controller, poi mettere sul codice dietro o in linea, non importa.Assicurati solo di non scrivere questo pezzo di codice di rendering in il Controller di azioni (in questo modo sarà davvero violare il pattern MVC).

Il code-behind è parte della Vista-è fino a voi, se si vuole mettere le cose in ASPX, direttamente o in code-behind.MVC non significa che devi avere il codice di tutte le cose brutte nella ASPX :).

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top