[英]Change Layout(Master Page) of view in ASP.NET MVC without recreate it
我正在使用帶有Razor視圖的ASP.NET MVC 3。 如果要創建視圖,可以為視圖選擇布局(母版頁),或者選擇“默認”(_Layout)。
我很有興趣在創建視圖后更改此布局而不重新創建它,是否有任何地方存儲有關視圖的布局信息? 我該怎么改變它?
在MVC3中,你有_ViewStart.cshtml
來存儲所有頁面的布局; 您可以更改此元素以更改所有頁面的布局,或者您可以在@{}
塊中的目標視圖頁面頂部添加新的Layout元素,如下所示,以更改特定頁面的布局:
@{
Layout = "~/Views/Shared/_newLayout.cshtml";
ViewBag.Title = "Index";
}
在cshtml文件的頂部創建視圖后,您可以看到包含的布局。
@{
Layout = "~/Views/Shared/_Layout.cshtml";
}
您可以簡單地替換它,例如使用不同的布局
@{
Layout = "~/Views/Shared/_Layout2.cshtml";
}
此外,您可以將其存儲在基本布局( _ViewStart.cshtml
)中,然后您的所有視圖都將使用該布局。
根據您的需要,有多種方法可以為視圖指定不同的布局:
如其他答案所述,只需更改視圖的Layout
屬性:
@{
Layout = "~/Views/Shared/_CustomLayout.cshtml";
}
MVC 3 添加了一個默認的 Views/_ViewStart.cshtml
,您可以在其中放置由所有視圖共享的邏輯。 您還可以在任何Views子目錄中創建其他_ViewStart.cshtml
文件以獲取其他自定義邏輯(它將在層次結構和Shared
文件夾中搜索,就像查找任何其他視圖或部分視圖一樣)。
將大量業務邏輯納入其中就像是違反了“關注點分離”原則,但同時它也非常方便。
請注意, _ViewStart.cshtml
繼承自StartPage ,而不是WebPage ,因此它的屬性可能與您習慣的略有不同(例如,您必須通過ViewContext
來獲取ViewBag
)。
@{
if (ViewContext.ViewBag.IsAdmin) // or other custom logic
{
Layout = "~/Views/Shared/_AdminLayout.cshtml";
}
else
{
Layout = "~/Views/Shared/_Layout.cshtml";
}
}
View()
方法有一個重載,它采用一個顯式的布局頁面(Intellisense將其稱為“主頁面”):
public ActionResult FooAction()
{
var model = new MyModel();
return View("Index", "_CustomLayout", model);
}
我們可以使用以下代碼在_ViewStart文件中更改布局的默認呈現:
@{
var controller = HttpContext.Current.Request.RequestContext.RouteData.Values["Controller"].ToString();
string layout = "";
if (controller == "Admin")
{
layout = "~/Views/Shared/_AdminLayout.cshtml";
}
else
{
layout = "~/Views/Shared/_Layout.cshtml";
}
Layout = layout;
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.