Удаление логики из частичных представлений в ASP.NET MVC - PullRequest
7 голосов
/ 05 июня 2009

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

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

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

Теперь в частичном представлении у меня ужасная логика, подобная этой;

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

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

} %>

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

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

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

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

Ответы [ 4 ]

13 голосов
/ 05 июня 2009

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

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

10 голосов
/ 08 июня 2009

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

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

Model.restaurantsList.Count() > 0

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

например:.

<%if (Model.HasResturant){...}%>
1 голос
/ 23 ноября 2009

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

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

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

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

1 голос
/ 23 ноября 2009

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

Однако я просто хочу сообщить вам, что вызов Html.RenderPartial () внутри цикла неэффективен .
ASP.NET MVC - для цикла внутри RenderPartial или вне 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");    
} %>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...