2011-11-07 64 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

聰明。我喜歡。我希望MVC框架忽略了沒有定義而不是拋出錯誤的部分,但是這允許我以我想要的方式定義部分。 – Brian

+0

@Brian但是,爲什麼不使用rendermatte建議itsmatt,這是更清潔? – gdoron

+0

因爲那麼我將不得不爲每個我想要添加邊欄的頁面創建一個部分(它是基於頁面的上下文)。 – Brian

0

對於基於用戶權限級別的條件使用部分對我來說感覺有點骯髒。我會使用RenderPartial(用戶)並把邏輯放在部分。

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

在我_Layout.cshtml文件我做了這樣的事情:

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

,以避免將所有子頁面都應對在本質上是相同的方式可選部分。當我第一次嘗試可選部分時,我發現我至少在我的實現中重複了自己的子頁面。

在我使用@RenderSection調用了可選部分的情況下,通常會提供頁面特定的內容。

+0

謝謝,但不幸的是每個頁面都可以有不同的元素在側邊欄(它基本上是一組上下文工具),所以這是行不通的。 – Brian