Pregunta

Me preguntaba si al mover declaraciones complejas if else y el marcado html resultante al código subyacente se viola alguna ley 'MVC'.

Parece una gran opción cuando nos enfrentamos a declaraciones if else en línea que pueden volverse extremadamente ilegibles.

¿Fue útil?

Solución

Prefiero no utilizar el código detrás de la clase en mis puntos de vista.Esto no se debe a que viole MVC de forma predeterminada, sino a que descubrí que la forma "natural" (al menos para mí) es diferente.

Cuando me enfrento a un marcado HTML complejo relacionado con cuestiones puramente de visualización, normalmente escribo un método de extensión para HtmlHelper clase para ocultar la complejidad.Así tengo extensiones como Html.MoneyTextBox(), Html.OptionGroup() y Html.Pager<T>.

En otros casos, cuando surgen condiciones complejas, normalmente se me escapa algo del controlador.Por ejemplo, todos los problemas relacionados con la visibilidad, solo lectura o habilitación de elementos generalmente surgen de algo que el controlador puede proporcionar.En ese caso, en lugar de pasar el modelo a la vista, creo un modelo de vista que encapsula el modelo y la información adicional que el controlador puede proporcionar para simplificar el marcado HTML.Un ejemplo típico de modelo de vista es el siguiente:

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
} 

Dicho esto, el código subyacente es parte de la vista, por lo que puedes usarlo libremente si se adapta mejor a tus necesidades.

Otros consejos

No es horrible tener condicionales en tu opinión. Los mantendría en la ASPX, no el código detrás. Sin embargo, un condicional a menudo indica un comportamiento controlador. Considere el siguiente código ASPX:

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

Este conjunto de condicionales representa el comportamiento de control que está manejando la vista, es decir, en el lugar equivocado. Este comportamiento no es comprobable por la unidad. Considere en su lugar:

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

En este ejemplo, ActionLink es una extensión personalizada de HtmlHelper que toma nuestro propio objeto de especificación ICommand. La acción del controlador que representa esta vista completa ViewData [& Quot; comandos & Quot;] en función de varias condiciones. En otras palabras, el controlador hace el control. En las pruebas unitarias para esta acción, podemos probar que el conjunto correcto de comandos se presentará en varias condiciones.

Al principio, esto puede parecer una molestia en comparación con arrojar rápidamente algunos IF a la vista. La pregunta que debe hacerse es: & "; ¿Esto SI representa un comportamiento controlador, y quiero asegurarme de que no se rompa en algún momento? &";

Creo que siempre y cuando sea un código de representación y esté en una " Ver " no en un controlador, entonces ponerlo en código detrás o en línea no importará. Solo asegúrese de no escribir esta parte del código de representación en las acciones de los Controladores (de esta manera realmente violará el patrón MVC).

El código subyacente es parte de la Vista: depende de usted si desea colocar cosas en el ASPX directamente o en el código subyacente. MVC no significa que tenga que codificar todas las cosas feas en el ASPX :).

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top