要點:
A.Layout屬性:等同於原來的MasterPageFile屬性.
B.@RenderBody()方法:直接渲染整個View到占位符處,而不需要原來所使用的<asp:Content />.
C.@RenderPage()方法:渲染指定的頁面到占位符處.
D.@RenderSection方法:聲明一個占位符,和原來的<asp:ContentPlaceHolder />功能類似.
E.@section標記:對@RenderSection方法聲明的占位符進行實現,和原來的<asp:Content />功能類似.
1.@RenderBody()方法的使用
首先在~/Views/Shared/下創建一個名為_MyLayout.cshtml的LayoutPage文件,並將默認的內容替換為如下:
<!DOCTYPE html>
<html>
<head>
<title>@ViewBag.Title</title>
</head>
<body>
<div>
開始渲染Body<br />
@RenderBody()
渲染Body結束<br />
</div>
</body>
</html>
然后打開在~/Views/Home/Index.cshtml文件並替換為如下的內容:
@{
ViewBag.Title = "首頁";
}
<div>
這里就是渲染Body啦.
</div>
最后別忘記把~/Views/_ViewStart.cshtml中的Layout屬性改為:
Layout = "~/Views/Shared/_MyLayout.cshtml";
瀏覽器輸出:
開始渲染Body
這里就是渲染Body啦.
渲染Body結束
在此,你或許會有疑問了.在_Layout中定義的RenderBody()是Render那個頁啊?
答:其實最后Render頁的歸屬就是Render你所訪問的那個頁,比如你訪問/Home/Index.那么Render就是Home控制器下的Index.cshtml這個文件, 如果訪問的是/Ohter/SomePage時,那么Render的是Ohter控制器下的SomePage這個.cshtml!
2.@RenderPage()方法的使用
在~/Views/Home/文件夾下新建立一個ViewPage1.cshtml文件,將內容改為如下:
<div>
這里是~/Views/Home/ViewPage1.cshtml
</div>
並在原來的_MyLayout.cshtml文件中增加幾行代碼變成下面的這個樣子:
<!DOCTYPE html>
<html>
<head>
<title>@ViewBag.Title</title>
</head>
<body>
<div>
開始渲染Body<br />
@RenderBody()
渲染Body結束<br />
<br />
開始渲染其他頁1<br />
@RenderPage("~/Views/Home/ViewPage1.cshtml")
渲染其他頁結束1<br />
開始渲染其他頁2<br />
@RenderPage("~/Views/Home/ViewPage1.cshtml")
渲染其他頁結束2<br />
開始渲染其他頁3<br />
@RenderPage("~/Views/Home/ViewPage1.cshtml")
渲染其他頁結束3<br />
</div>
</body>
</html>
在這里記住:@RenderBody()只能在_Layout.cshtml中使用一次,而@RenderPage()則可以使用多次!另外@RenderPage()是直接定位View頁面,不會運行對應的Action方法。
3.@RenderSection方法和@section標記
@RenderSection()方法等價於<asp:ContentPlaceHolder />,用途為在Layout中聲明一個占位符.
在原來的_MyLayout.cshtml文件中更改內容為如下:
<!DOCTYPE html>
<html>
<head>
<title>@ViewBag.Title</title>
</head>
<body>
<div>
開始渲染Body<br />
@RenderBody()
渲染Body結束<br />
<br />
開始渲染其他頁1<br />
@RenderPage("~/Views/Home/ViewPage1.cshtml")
渲染其他頁結束1<br />
開始渲染其他頁2<br />
@RenderPage("~/Views/Home/ViewPage1.cshtml")
渲染其他頁結束2<br />
開始渲染其他頁3<br />
@RenderPage("~/Views/Home/ViewPage1.cshtml")
渲染其他頁結束3<br />
<br />
HOHO,開始學習Section了<br />
開始渲染Section<br />
聲明方式1(推薦):SectionA:<br />
@RenderSection("SectionA", false)
-------<br />
聲明方式2:SectionB:<br />
@{
if (IsSectionDefined("SectionB"))
{
@RenderSection("SectionB")
}
}
-------<br />
渲染Sction結束<br />
</div>
</body>
</html>
在~/Views/Home/Index.cshtml中更改為如下內容:
@{
ViewBag.Title = "首頁";
}
@section SectionA{
<div>這里是SectionA:也不需要寫神馬runat="server"啊,有木有</div>
}
@section SectionB{
<div>這里是SectionB:也不需要寫神馬<asp:Content />啊,有木有</div>
}
<div>
這里就是渲染Body啦.~~不需要寫神馬<asp:Content />,其實因為RenderBody()不在有歧義.
</div>
最后顯示結果:
開始渲染Body
這里就是渲染Body啦.
渲染Body結束
開始渲染其他頁1
這里是~/Views/Home/ViewPage1.cshtml
str1
str2
渲染其他頁結束
開始渲染其他頁2
這里是~/Views/Home/ViewPage1.cshtml
str1
str2
渲染其他頁結束
開始渲染其他頁3
這里是~/Views/Home/ViewPage1.cshtml
str1
str2
渲染其他頁結束
HOHO,開始學習Section了
開始渲染Section
聲明方式1(推薦):SectionA:
這里是SectionA
-------
聲明方式2:SectionB:
這里是SectionB
-------
渲染Sction結束
問:為什么為什么要推薦方式1呢?
答:因為RenderSection()方法有2個重載.
如果使用第一個只接受一個string類型參數的重載的話.~如果你在具體的View中沒有利用@section來定義實現的話,運行會報錯.所以需要配合另外一個方法IsSectionDefined()來使用,才能防止報錯.
而使用第2個重載就可以利用第二個bool類型的參數指明該Section是否為必須的.所以可以在使用該RenderSection方法的時候直接利用第二個重載,再把bool參數值設為false,即使你在具體的View中沒有聲明實現@section,運行起來也一如既往地蛋定,不Show黃頁.