2009-06-05 15 views
7

Sono consapevole che le viste non dovrebbero contenere il codice ma in un progetto su cui sto lavorando ho molta logica nelle viste.Rimozione della logica dalle viste parziali in ASP.NET MVC

La mia home page ha

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

Ora, nella vista parziale ho un sacco aweful di logica come questo;

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

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

} %> 

Ora ho potuto fare il controller di casa restituire una visione diversa in base all'elenco di essere vuota, ma non voglio davvero così come la vista indice ha un paio di cose che mi desidera visualizzare non importa se ci sono risultati o no

L'unica altra cosa che posso pensare qui è incapsularlo in un metodo di supporto come Html.SearchResults. Ma allora avrei bisogno che l'helper chiami anche il renderPartial per ogni risultato di ricerca. Ciò non sembra una separazione pulita delle preoccupazioni.

Dovrei comunque avere la prima istruzione if nella vista parziale.

Come gestiresti meglio questo?

+0

+1 Mi sono sempre chiesto quale sia la procedura migliore in questo caso. –

risposta

13

La mia opinione personale è che questo è ok. La logica che hai utilizzato è totalmente correlata alla modalità di visualizzazione del modello.

Devi solo essere consapevole e assicurarti di non mischiare mai in business logic, logica di accesso ai dati o qualsiasi altra cosa che non sia strettamente legata alla visualizzazione del modello.

+0

Sì, mi sono chiesto. Quindi va bene per la logica di visualizzazione. Accetterò presto la tua risposta. Voglio vedere se ci sono altre oppinzioni prima;) – ddd

10

Sono d'accordo con la risposta di Praveen Angyan. L'unica cosa che potrei dire per estendere la sua risposta è mettere un po 'di logica nel ViewModel.

Ad esempio, nel ViewModel si potrebbe nascondere

Model.restaurantsList.Count() > 0

dietro un metodo o una proprietà.

es .:

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

questa risposta non ha nulla a che fare con la vostra domanda.

Tuttavia, voglio solo farti sapere che chiamare Html.RenderPartial() all'interno di un ciclo è non efficiente.
ASP.NET MVC - For loop inside RenderPartial or Outside RenderPartial

Cambiarlo in qualcosa di simile sarebbe meglio.

<%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 meno che in mvc3 qualcosa non sia cambiato, ciò è completamente vero. i viewengines non memorizzano nella cache i partial che sono stati trovati e dovranno "refindarli" ogni iterazione. –

1

Praveen Angyan è corretto: questa è logica di visualizzazione ed è giusto che sia dove si trova.
Ma ciò non cambia la necessità di visualizzazioni più ordinate.

Volevo solo condividere piccoli miglioramenti.
Se attribuiamo piccolo metodo HtmlHelper, siamo in grado di ridurre al fine di qualcosa di simile:

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

Per alcuni - potrebbe non sembrare leggibile e piacevole, ma si adatta per me abbastanza buono.

Problemi correlati