在ASP.NET MVC中更改视图的布局(母版页)而不重新创建它

Sae*_*eid 44 .net c# asp.net asp.net-mvc asp.net-mvc-3

我正在使用带有Razor视图的ASP.NET MVC 3.如果要创建视图,可以为视图选择布局(母版页),或者选择"默认"(_Layout).

我很有兴趣在创建视图后更改此布局而不重新创建它,是否有任何地方存储有关视图的布局信息?我该怎么改变它?

Sae*_*eid 69

在MVC3中,您可以_ViewStart.cshtml存储所有页面的布局; 您可以更改此元素以更改所有页面的布局,或者您可以在@{}块中的目标视图页面顶部添加新的布局元素,如下所示,以更改特定页面的布局:

@{
    Layout = "~/Views/Shared/_newLayout.cshtml";
    ViewBag.Title = "Index";
}
Run Code Online (Sandbox Code Playgroud)


Chu*_*ris 22

在cshtml文件的顶部创建视图后,您可以看到包含的布局.

@{
    Layout = "~/Views/Shared/_Layout.cshtml";
}
Run Code Online (Sandbox Code Playgroud)

您可以简单地替换它,例如使用不同的布局

@{
    Layout = "~/Views/Shared/_Layout2.cshtml";
}
Run Code Online (Sandbox Code Playgroud)

此外,您可以将其存储在基本布局(_ViewStart.cshtml)中,然后您的所有视图都将使用该布局.


Tob*_*s J 20

根据您的需要,有多种方法可以为视图指定不同的布局:

在视图中

如其他答案所述,只需更改视图的Layout属性:

@{
    Layout = "~/Views/Shared/_CustomLayout.cshtml";
}
Run Code Online (Sandbox Code Playgroud)

在_ViewStart.cshtml中

MVC 3 添加了一个默认值 Views/_ViewStart.cshtml,您可以在其中放置所有视图共享的逻辑.您还可以_ViewStart.cshtml在任何Views子目录中创建其他文件以获取其他自定义逻辑(它将在层次结构和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";
    }
}
Run Code Online (Sandbox Code Playgroud)

在Controller动作中

View()方法有一个重载,它采用一个显式的布局页面(Intellisense将其称为"主页面"):

    public ActionResult FooAction()
    {
        var model = new MyModel();

        return View("Index", "_CustomLayout", model);
    }
Run Code Online (Sandbox Code Playgroud)


Jit*_*dra 7

我们可以使用以下代码在_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;
}
Run Code Online (Sandbox Code Playgroud)

  • 这些代码在控制器中会更好(特别是`Admin`的布局,而其他人则默认保留). (4认同)