2011-11-07 14 views
12

私のウェブサイトには、ユーザー(管理者)のサブセットに対してのみレンダリングしたいセクション(浮動サイドバー)があります。セクションを表示するかどうかを判断するためにロジックをマスターレイアウトに置くことができますが、セクションがレンダリングされていないと、ページにエラーが発生することがあります。オプションでASP.Net MVC 3のセクションをレンダリングする方法はありますか?

例コード - Layout.cshtml ...

... code ... 
@if(user.IsAdmin) { 
    @RenderSection("AdminSidebar", false) 
} 

例コード - MyPage.cshtml ...

@section AdminSidebar { 
    ... code ... 
} 

は、誰もがこれを置くことなく、動作するように取得する方法を知っていますすべての子ページのロジック?

メモとして、IsSectionDefined( "AdminSidebar")はレイアウトファイルでのみ機能します。セクションが使用可能かどうかをテストするページでは機能しません。

答えて

16

これは、フレームワークを乱用されていない場合、私は知らないが、あなたは次のことを試みることができるという道を行くのは本当に傾いている場合:

@{ 
    if(user.IsAdmin) { 
     @RenderSection("AdminSidebar", false) 
    } 
    else { 
     RenderSection("AdminSidebar", false).WriteTo(TextWriter.Null); 
    } 
} 
+1

Clever。私はそれが好きです。私は、MVCフレームワークが、エラーをスローする代わりに定義されていないセクションを無視したほうがいいと思いますが、これにより、私が望むようにセクションを定義することができます。 – Brian

+0

@Brianしかし、それははるかにクリーンなitsmattによって提案されたrenderPartialを使用していないのはなぜですか? – gdoron

+0

そのため、サイドバーを追加したいすべてのページの部分を作成する必要があります(ページに基づいたコンテキストに基づいています)。 – Brian

0

ユーザーの権限レベルに基づいて条件付きのセクションを使用すると、少し汚いと感じます。私はRenderPartial(ユーザー)を使用し、ロジックを部分的に配置します。

@if(user.IsAdmin) 
{ 
    @Html.Partial("SideBar") 
} 

子ページのすべてを持っている本質的に同じ方法で、オプションのセクションに対処してきたことを避けるために:私の_Layout.cshtmlファイルで

@if(user.IsAdmin) { 
     ..code.. 
    } 
1

は、私はこのような何かをしました。私が最初にオプションセクションのものを試したとき、少なくとも私の実装では、子ページで自分自身を繰り返していることがわかりました。

ここでは、任意のセクションに対して@RenderSectionコールを使用しましたが、これは一般にページ固有のものを提供することでした。

+0

おかげで、残念ながら各ページは異なる要素を持つことができますサイドバー(基本的にはコンテキストツールのセット)にあるので、これはうまくいかないでしょう。 – Brian

関連する問題