@RenderSection相當於在母版頁占一個位置
解決頁面差異化的問題
如JS何CSS的調用
1
2
3
4
后台管理5
6
7
8 @RenderSection("HeadJs")9
10
11 @RenderBody()12
13
1 @section HeadJs{2
3 }
但是當如果使用了_Layout.cshtml做母版頁的頁沒有實現Section的話,
譬如我新建的Index.cshtml沒有實現@section SubMenu{...},就會拋出異常
這是因為我在_Layout.cshtml中使用的是@RenderSection("SubMenu")他要求所有子頁都要實現,
可以使用它的另外一個重載@RenderSection("SubMenu",false),第二個參數代表它不是必須的,就不會拋出異常。
還有,當我在母版頁中定義了@RenderSection("SubMenu",false)的時候,我希望當所有子頁都沒有實現這個Section
的時候,母版頁可以有自己的呈現內容,就可以用
{
@RenderSection("SubMenu",false)
}else{
SubMenu Sectionisnot defined!
}這樣當沒有任何頁面呈現Section的時候,就會默認顯示定義的內容。
還有一種比較靈活的方法,通過擴展方法來實現publicstaticclassUtility
{publicstaticHelperResult RenderSection(thisWebPageBase page,stringsectionName, FuncdefaultContent)
{if(page.IsSectionDefined(sectionName))
{returnpage.RenderSection(sectionName);
}else{returndefaultContent(null);
}
}
}
在母版頁中@this.RenderSection("SubMenu", @
OK了!沒有呈現Section時,就默認顯示
四、@Html.Partial
Partial 每次都會創建自己的 TextWriter 實例並且把內容緩存在內存中. 最后把所有 writer輸出的內容發送到一個 MvcString對象中
更多時候我們會使用 @{ Html.RenderPartial("Details"); } 而不是@Html.Partial
Html.RenderPartial()與@Html.Partial的區別
Html.RenderPartial 直接輸出至當前 HttpContext(因為是直接輸出,所以性能好)。
Html.Partial 將視圖內容直接生成一個字符串並返回(相當於有個轉義的過程)。
RenderPage()和RenderPartial()的區別
RenderPage()調用的頁面只能使用其傳遞過去的數據。
而RenderPartial()是可以使用viewdata,model等數據的。
如:@{Html.RenderPartial("BasicChart",model);}
用這個重載可以在部分視圖里使用強類型,然后在主視圖中使用第二個參數傳model過去
@{Html.RenderPartial("BasicChart",ViewData["myData"]);}
Html.RenderPartial和Html.RenderAction的區別
Html.RenderPartial適合用在重覆使用的UserControl,並且只需要透過Model來呈現內容,或是對於廣告的UserControl也適合使用。
Html.RenderAction則會先去呼叫Controller的Action方法,如果此UserControl是需要透過資料庫取得資料來呈現(透過Action來讀取資料庫),此時會比較適合使用此方式。
補充:
1、帶有Render的方法返回值是void,在方法內部進行輸出;不帶的返回值類型為MvcHtmlString,所以只能這樣使用:
@Html.Partial 對應 @{Html.RenderPartial(....);}
@Html.Action 對應 @{Html.RenderAction(....);}
2、Html.Partial可以直接提供用戶控件名作為參數,而Html.Action需要有對應的Action,在Action內部返回PartailResult(即retun PartialView())。
3、對於簡單的沒有任何邏輯的用戶控件,推薦使用Html.Partial;對於需要設置一些Model的用戶控件,推薦使用Html.Action。當然,有Model數據也是可以使用Html.Partial方法的,可以看方法的重載。
4、使用Html.Action有個好處,就是可以根據不同的場景選擇不同的用戶控件。
比如:
@Html.Action("UserInfoControl")
在對應的UserInfoControl這個Action中,在用戶未登錄的時候,可以retun PartialView("LogOnUserControl");登錄后,可以retun PartialView("UserInfoControl");