2016-08-02 43 views
4

我试图摆脱必须在每个创建的剃刀视图中手动指定布局路径的风险。如何在不指定剃刀视图中的布局路径的情况下指定全局MVC布局

在Razor视图

所以,你通常会指定视图/布局属性,如:

@{ 
    ViewBag.Title = "About Us"; 
    Layout = "~/Views/Shared/_ContentLayout.cshtml"; 
} 

我有我的所有控制器都继承了基本的控制器,其中我很想能够指定这个级别的布局,或者在app_start等。

对于任何例外,我只是在视图本身覆盖它。

经过广泛的搜索,我还没有找到任何人能够做到这一点的证据。

我现在,下一个最好的解决方法是在ViewBag指定此,以保持它的动态,但我仍然需要把一个声明中的观点:

@{ 
    Layout = ViewBag.Layout; 
} 

这可能吗?解决方案?

回答

3

参考:http://weblogs.asp.net/scottgu/asp-net-mvc-3-layouts

由于MVC3有一个约定,其中...

您可以添加一个名为_ViewStart.cshtml(或_ViewStart.vbhtml为VB) 文件的\Views文件夹下您的项目:

_ViewStart文件可用于定义您想要在每个视图的渲染开始时执行的常见视图代码。例如,我们可以 我们_ViewStart.cshtml文件中写代码编程 设置布局属性为每个视图是_ContentLayout.cshtml文件 默认:

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

因为这段代码在执行每个视图的开始,我们不再需要 在我们的任何单个视图文件 (除非我们想覆盖上面的默认值)之外明确设置布局。

+0

相信这个回答我的问题,是的,似乎我已经有一个文件,谢谢!但是,这可以应用在控制器的基础上,即。每个控制器都有一个默认模板? – MikeDub

+0

您也可以在'_ViewStart'中执行此操作。您可以轻松完成条件声明并检查控制器。取决于控制器,您可以设置适合的“布局”。 – Nkosi

3

正如Nkosi提到的,​​如果您希望根据控制器调整布局而不指定视图中的布局路径,则可以在_ViewStart文件中执行条件块。

但是我发现也适用,是一点点更容易...

  • 将在每个视图文件夹_ViewStart文件(涉及控制器),你想有一个不同布局。
  • 查看区域文件夹中更具体的_ViewStart覆盖全局_ViewStart文件。

Specifying different layouts in each folder

+1

这比我的条件性建议容易得多。我完全错过了嵌套视图的开始。 – Nkosi