从ASP.NET MVC中的部分视图中删除逻辑

时间:2009-06-05 16:25:50

标签: asp.net-mvc refactoring partial-views

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

我的主页有

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

} %>

现在我可以让家庭控制器返回一个基于列表为空的不同视图,但我真的不想这样,因为索引视图有一些我想要显示的东西,无论是否有结果。< / p>

我能想到的另一件事就是将它封装在一个辅助方法中,比如Html.SearchResults。但是我需要帮助器来为每个搜索结果调用renderPartial。这似乎不是关心的清晰分离。

我仍然需要在局部视图中使用第一个if语句。

你最好怎么处理这个?

4 个答案:

答案 0 :(得分:13)

我个人认为这是可以的。您使用的逻辑与模型的显示方式完全相关。

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

答案 1 :(得分:10)

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

例如,在ViewModel中你可以隐藏

Model.restaurantsList.Count() > 0

在方法或属性后面。

E.G:

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

答案 2 :(得分: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");    
} %>

答案 3 :(得分:1)

Praveen Angyan是正确的 - 这是观点逻辑,它很好,它就在它的位置 但这并没有改变对整洁观点的需求。

只想分享小改进 如果我们附加微小的HtmlHelper方法,我们可以将视图缩短为这样:

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

对某些人来说 - 它可能看起来不那么可读,但它对我来说足够好。

相关问题