【问题标题】:How to specify global MVC layout without specifying layout path in razor view如何在剃刀视图中指定全局 MVC 布局而不指定布局路径
【发布时间】:2016-08-03 04:37:27
【问题描述】:

我试图避免在我拥有/创建的每个 Razor 视图中手动指定布局路径。

因此,在剃刀视图中,您通常会指定视图/布局属性,例如:

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

我有一个我的所有控制器都继承的基本控制器,我希望能够在此级别指定布局,或者在 app_start 等中指定布局。

对于任何例外情况,我都会在视图本身中覆盖它。

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

我目前的下一个最佳解决方法是在 ViewBag 中指定它,以使其保持动态,但我仍然需要在视图中放置声明:

@{
  Layout = ViewBag.Layout;
}

有可能吗?解决方案?

【问题讨论】:

    标签: c# asp.net-mvc asp.net-mvc-4 inheritance razor


    【解决方案1】:

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

    由于 MVC3 有一个约定...

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

    _ViewStart 文件可用于定义您可以使用的通用视图代码 想要在每个视图的渲染开始时执行。例如,我们 可以在我们的 _ViewStart.cshtml 文件中以编程方式编写代码 将每个 View 的 Layout 属性设置为 _ContentLayout.cshtml 文件 默认情况下:

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

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

    【讨论】:

    • 相信这回答了我的问题,是的,我似乎已经有了那个文件,谢谢!但这可以在控制器的基础上应用,即。每个控制器都有一个默认模板?
    • 您也可以在_ViewStart 中执行此操作。您可以轻松地执行条件语句并检查控制器。取决于控制器,您将 Layout 设置为适合。
    【解决方案2】:

    正如 Nkosi 所提到的,如果您想在不指定视图中的布局路径的情况下根据每个控制器调整布局,您可以在 _ViewStart 文件中执行条件块。

    但我发现的方法也有效,而且稍微容易一些......

    • 在每个视图文件夹(与控制器相关)中放置一个_ViewStart 文件,您希望它们具有不同的布局。
    • 查看区域文件夹中更具体的_ViewStart 会覆盖全局_ViewStart 文件。

    【讨论】:

    • 这比我有条件的建议要容易得多。我完全错过了嵌套视图的开始。
    猜你喜欢
    • 1970-01-01
    • 2012-03-31
    • 1970-01-01
    • 2020-08-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多