0

サイトの大部分のテンプレートとして、ナビゲーション付きで作成した Site.Master ファイルがあります。このナビゲーションは、再帰的なエンティティ (ページと呼ばれる) に基づいて動的に作成されます。parentID が 0 のページはトップ レベルであり、当然、各子はそのフィールドで親の ID を持ちます。

ページの ID を受け取り、渡された Id と一致する parentId を持つ子に対して foreach を実行してナビゲーションを生成する、簡単な小さな HTML ヘルパーを作成しました。サイトの大部分では、Site.Master で parentId 0 を使用する必要がありますが、ページを表示する厳密に型指定されたビューを使用している場合は、当然、ページの ID を使用したいと考えています。

Site.Master でそのような条件付きロジックを実行する方法はありますか (そして、それは MVC ルールに違反しますか)? 「/Page/{Id} の厳密に型指定されたページにいる場合は、Id レンダリング ナビゲーションを使用し、それ以外の場合は 0 を使用します」

4

2 に答える 2

1

理解した:

        int navPageId = 0;
        if (ViewContext.RouteData.Values["controller"] == "Pages" && ViewContext.RouteData.Values["Id"] != null)
        {
            navPageId = Convert.ToInt32(ViewContext.RouteData.Values["Id"]);
        }
        Html.RenderNav(navPageId);
于 2010-06-05T06:23:23.670 に答える
1

PageID は Pages Controller でのみ役立つようです。

を介して PageID をViewDataビューに渡すことを検討してください。マスター ページは、ViewData が存在するかどうかを確認し、必要に応じて Html ヘルパー メソッドを呼び出すことができます。

ページコントローラー:

    ViewData["PageID"] = somePageID; //zero or non-zero.

Master : いずれかのコントローラーが実際に ViewData で PageID の値を渡すと、Html スニペットが書き込まれます。渡されない場合は、安価な null のチェックです。

<% if (ViewData["PageID"] != null)
{
   Response.Write(Html.RenderNav(ViewData["PageID"]));
}
%>

このスタイルは、私にとって最も理にかなっています。PagesController は単純な値を に渡しますViewData

これを、すべてのリクエストで判別しようとするマスター ページとは対照的です。URL は何か、コントローラーは誰か、OK、今度は PageID を取得し、それは数値か、OK、HTML を記述します。そのすべてのロジックはビューに属していません。慣習に従って、ビューをダムに保ちます。

厳密に型指定された ViewModel からこれを除外することをお勧めしますが、 in で使用してViewDataください。このように、強く型付けされていないマスターでの存在の単純なチェックです。

ViewDataこの戦略の方が理解しやすく、維持しやすいことをお勧めします。

このナビゲーションをマスターに書き出したいようです。ビューが表示される内容をきめ細かく制御できる Content Area に移動することを検討してください。

ページ ビュー:

<asp:Content ID="nav" ContentPlaceHolderID="PagesNavContent" runat="server">
    <%= Html.RenderNav(ViewData["PageID"])%>
</asp:Content>
于 2010-06-05T04:27:57.853 に答える