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

我正在使用带有Razor视图的ASP.NET MVC 3。 当你想创build一个视图时,你可以为你的视图select一个布局(母版页),或者让它selectDefault(_Layout)。

我很有兴趣在创build视图后更改此布局而不重新创build视图,是否有任何位置存储有关视图的布局信息? 我该如何改变它?

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

 @{ Layout = "~/Views/Shared/_newLayout.cshtml"; ViewBag.Title = "Index"; } 

在cshtml文件的顶部创build你的视图后,你可以看到你的布局。

 @{ Layout = "~/Views/Shared/_Layout.cshtml"; } 

您可以简单地将其replace为不同的布局

 @{ Layout = "~/Views/Shared/_Layout2.cshtml"; } 

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

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

在视图中

正如其他答案中提到的,只需更改视图的Layout属性:

 @{ Layout = "~/Views/Shared/_CustomLayout.cshtml"; } 

在_ViewStart.cshtml中

MVC 3 添加了一个默认的 Views/_ViewStart.cshtml ,你可以把所有的视图共享的逻辑。 您还可以在任何Views子目录中创build额外的_ViewStart.cshtml文件,用于额外的自定义逻辑(它将search层次结构和Shared文件夹,就像查找其他视图或部分时一样)。

把大量的业务逻辑放到这里就好像是违反了“关注点分离”的原则,但是同时它可以非常方便。

请注意, _ViewStart.cshtmlinheritance自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; }