2009-06-05 2 views
7

Я знаю, что представления не должны иметь код в них, но в проекте, над которым я работаю, у меня много логики в представлениях.Удаление логики из частичных представлений в ASP.NET MVC

Моя страница имеет

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

Сейчас в частичном виде у меня есть aweful много логики, как это;

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

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

} %> 

Теперь я мог сделать домашний контроллер возвращает другую точку зрения на основе списка будучи пустым, но я не хочу, чтобы как Индексный есть несколько вещей, которые я хочу отображаться независимо от того, если есть результаты или нет.

Единственное, что я могу придумать здесь, это encapsualte это в вспомогательном методе, таком как Html.SearchResults. Но тогда мне понадобится помощник для вызова renderPartial для каждого результата поиска. Это не похоже на чистое разделение проблем.

Хотя я все равно должен иметь первое утверждение if в частичном представлении.

Как вы лучше всего справитесь с этим?

+0

+1 Всегда задавался вопросом, что такое лучшая практика в этом случае. –

ответ

13

Мое личное мнение, что все в порядке. Логика, которую вы использовали, полностью связана с тем, как должна отображаться модель.

Вам просто нужно знать и убедиться, что вы никогда не смешиваете бизнес-логику, логику доступа к данным или что-то еще, что строго не связано с отображением модели.

+0

Да, я подумал. Так что это нормально для логики отображения. Я скоро приму ваш ответ. Я хочу посмотреть, есть ли еще какие-то другие варианты;) – ddd

10

Я согласен с ответом Правеена Ангяна. Единственное, что я мог сказать, чтобы продлить его ответ, - это поместить некоторые из логики в ViewModel.

Например, в ViewModel можно скрыть

Model.restaurantsList.Count() > 0

позади метода или свойства.

т.д .:

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

этот ответ не имеет ничего общего с вашим вопросом.

Однако я просто хочу сообщить, что вызов Html.RenderPartial() внутри цикла неэффективен.
ASP.NET MVC - For loop inside RenderPartial or Outside RenderPartial

Изменение его на что-то вроде ниже было бы лучше.

<%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

, если в mvc3 что-то не изменилось, это полностью верно. viewengines не кэшируют найденные партитуры и должны будут «переделать» их каждую итерацию. –

1

Правейн Ангьян прав - это логика взглядов, и это прекрасно, что это где.
Но это не меняет необходимости в более изысканных взглядах.

Просто хотел разделить небольшое улучшение.
Если мы придаем крошечный метод HtmlHelper, мы можем сократить вид что-то вроде этого:

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

Для некоторых - это могут выглядеть не читаемые и хорошо, но он подходит для меня достаточно хорошо.