簡體   English   中英

在ASP.NET MVC中更改視圖的布局(母版頁)而不重新創建它

[英]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";
}

在_ViewStart.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";
    }
}

在Controller動作中

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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM