7

我知道视图中不应包含代码,但在我正在处理的项目中,视图中有很多逻辑。

我的主页有

<% 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");

} %>

现在我可以让主控制器根据列表为空返回一个不同的视图,但我真的不希望这样,因为无论是否有结果,索引视图都有一些我想要显示的东西。

我在这里唯一能想到的另一件事是将其封装在 Html.SearchResults 之类的辅助方法中。但后来我需要助手为每个搜索结果调用 renderPartial。这似乎不是完全分离关注点。

不过,我仍然必须在部分视图中使用第一个 if 语句。

你会如何最好地处理这个问题?

4

4 回答 4

13

我个人的看法是,这没问题。您使用的逻辑与模型的显示方式完全相关。

您只需要注意并确保您永远不会混入业务逻辑、数据访问逻辑或其他任何与模型显示没有严格关联的东西。

于 2009-06-05T16:30:47.103 回答
10

我同意 Praveen Angyan 的回答。我可以说扩展他的答案的唯一一件事就是将一些逻辑放在 ViewModel 中。

例如在 ViewModel 你可以隐藏

Model.restaurantsList.Count() > 0

在方法或属性后面。

例如:

<%if (Model.HasResturant){...}%>
于 2009-06-08T08:32:32.053 回答
1

这个答案与你的问题无关。

但是,我只想让您知道,在循环内调用 Html.RenderPartial()效率不高
ASP.NET MVC - RenderPartial 内或 RenderPartial 外的 For 循环

将其更改为以下内容会更好。

<%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");    
} %>
于 2009-11-23T17:07:22.110 回答
1

Praveen Angyan 是正确的——这是视图逻辑,它在哪里也没关系。
但这并没有改变对更整洁视图的需求。

只是想分享一些小的改进。
如果我们附加微小的 HtmlHelper 方法,我们可以将视图缩短为如下所示:

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

对于某些人来说 - 它可能看起来不可读且不好看,但它对我来说已经足够好了。

于 2009-11-23T17:20:44.203 回答