2014-03-06 84 views
3

我在文件Shared/_Header.cshtml中有一些簡單的<header>東西。asp.net mvs部分/部分內的部分?

我的共享/ _Layout.cshtml插入的代碼通過調用

@Html.Partial("_Header") 

這工作得很好至今。

現在我有一些意見,除了通過@RenderBody()正常輸出,還應該在標題中的特定位置添加一些圖標。

我在幾個視圖中使用@RenderSection(),創建一個側邊欄等

現在我的想法是創造我的觀點​​(例如家庭/ Details.cshtml)內的部分和RenderSection添加調用_Header。佈局會調用標題,並且標題反過來會查看該部分是否存在並調用它。

但是,這似乎並不奏效。我得到以下錯誤/例外:

The file "~/Views/Shared/_Header.cshtml" cannot be requested directly because it calls the "RenderSection" method. 

哪裏有我的錯誤?我知道我可以在部分內「嵌套」部分調用。此代碼工作得很好,告訴佈局使用什麼文件邊欄:

@section Sidebar{ 
    @Html.Partial("_SidebarDetails") 
} 

這豈不工作過來呢?

我需要在視圖內部定義HTML塊,然後將其放入由佈局調用的部分內的預定義位置。

請幫我理解如何做到這一點。

回答

3

如果一個視圖包含RenderSection它被認爲是佈局頁面,不能直接渲染。看到這個問題的更多信息:The file "~/Views/Position/Edit.cshtml" cannot be requested directly because it calls the "RenderSection" method

最簡單的解決方案是合併局部視圖到佈局特別是如果_Header.cshtml僅包含佈局頁面上。

另一種選擇是在需要時用自定義標頭覆蓋標題視圖。

在你的頁面佈局:

@if (IsSectionDefined("Header")) 
{ 
    RenderSection("Header"); 
} 
else 
{ 
    @Html.Partial("_Header"); 
} 

在您的視圖(自定義圖標):

@section Header 
{ 
    @Html.Partial("_CustomHeader") 
} 

進一步的解決方案是將所有模型從包含自定義圖標一個基礎模型類派生數據,例如

public abstract class BaseModel 
{ 
    public List<Icon> Icons { get; set; } 
} 

public class ModelWithIcons : BaseModel 
{ 
    public ModelWithIcons() 
    { 
     // Set up icon data 
    } 
} 

的_header局部視圖(仍然在佈局頁)中定義的使用這個示範基地,並與null檢查,使任何圖標發現:

@model BaseModel 

<!-- Header HTML --> 
@if (Model != null && Model.Icon) 
{ 
    // Render icons 
} 
<!-- More HTML --> 

這裏最明顯的缺點是,所有的模型都必須從BaseModel類派生,或者局部視圖會拋出錯誤。

+0

感謝您提供詳細的答案和可能的解決方案。它幫助我瞭解了很多。 – Kodekan