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.NETMVC-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 に答える