2009-06-05 17 views
7

Soy consciente de que las vistas no deberían tener código, pero en un proyecto en el que estoy trabajando Tengo mucha lógica en las vistas.Eliminando lógica de vistas parciales en ASP.NET MVC

Mi página de inicio tiene

<% Html.RenderPartial("SearchResults"); %> 

Ahora en la vista parcial Tengo una gran cantidad horrible de la lógica como ésta;

<div id="RestaurantsList"> 
<%if (Model.restaurantsList.Count() > 0) 
{ 
    foreach (var item in Model.restaurantsList) 
    { %> 
     <% Html.RenderPartial("SearchResult", item); %> 

    <% 
    } %> 
<% 
} 
else 
{ 
    Html.RenderPartial("NoResults"); 

} %> 

Ahora podría hacer que el controlador de regreso a casa un punto de vista diferente sobre la base de la lista está vacía, pero yo realmente no quiero que a medida que la vista del índice tiene un par de cosas que desea que se muestren no importa si hay resultados o no.

Lo único que se me ocurre aquí es encapsularlo en un método auxiliar como Html.SearchResults. Pero luego necesitaría el ayudante para llamar al renderPartial para cada resultado de búsqueda también. Eso no parece una clara separación de preocupaciones.

Todavía tendría que tener la primera instrucción if en la vista parcial.

¿Cómo manejarías esto mejor?

+0

+1 Siempre me he preguntado cuál es la mejor práctica en este caso. –

Respuesta

13

Mi opinión personal es que esto está bien. La lógica que ha utilizado está totalmente relacionada con la forma en que se debe mostrar el modelo.

Solo debe tener en cuenta y asegurarse de no mezclar nunca la lógica comercial, la lógica de acceso a datos o cualquier otra cosa que no esté estrictamente ligada a la visualización del modelo.

+0

Sí, me lo pregunté. Entonces está bien para la lógica de visualización. Aceptaré su respuesta pronto. Quiero ver si hay otras opiniones primero;) – ddd

10

Acepto la respuesta de Praveen Angyan. Lo único que podría decir para extender su respuesta es poner algo de lógica en ViewModel.

Por ejemplo, en el modelo de vista que podría ocultar

Model.restaurantsList.Count() > 0

detrás de un método o propiedad.

ej .:

<%if (Model.HasResturant){...}%> 
1

esta respuesta no tiene nada que ver con su pregunta.

Sin embargo, solo quiero que sepan que llamar a Html.RenderPartial() dentro de un bucle es no eficiente.
ASP.NET MVC - For loop inside RenderPartial or Outside RenderPartial

Cambiarlo a algo como lo siguiente sería mejor.

<%if (Model.restaurantsList.Count() > 0) 
{ 
    // render the Restaurant item right away 
    foreach (var item in Model.restaurantsList) { %> 
     <div> 
      <%= Html.Encode(item.RestaurantName); %><br /> 
      <%= Html.Encode(item.Address); %> 
     </div> 
    <% } 
} 
else 
{ 
    Html.RenderPartial("NoResults");  
} %> 
+0

a menos que en mvc3 algo haya cambiado, esto es totalmente cierto. los viewengines no almacenan en caché los parciales que se han encontrado, y tendrán que 'refind' cada iteración. –

1

Praveen Angyan es correcto, eso es lógica de vista y está bien que esté donde está.
Pero eso no cambia la necesidad de vistas más ordenadas.

Solo quería compartir pequeñas mejoras.
Si atribuimos método HtmlHelper pequeña, podemos acortar el fin de algo como esto:

<div id="RestaurantsList"> 
<% if (Model.HasRestaurants) 
    Html.RenderPartialForEach("SearchResult", Model.restaurantsList);  
else  
    Html.RenderPartial("NoResults"); %> 
</div> 

Para algunos - puede que no parece fácil de leer y agradable, pero se ajusta para mí lo suficientemente bueno.

Cuestiones relacionadas