修改视图外的razor Layout

Modify razor Layout outside the view

我在共享文件夹中有一个视图,我正在多个区域使用它。我现在面临的问题是该区域 _viewstart.cshtml 的布局未应用。

我还尝试了在 MVC4 中使用的单独布局注入器(下面的代码),但注入器的问题是 MasterName 不再可用。

public class LayoutInjecterAttribute : ActionFilterAttribute
{
    public override void OnActionExecuted(ActionExecutedContext filterContext)
    {
        base.OnActionExecuted(filterContext);
        var result = filterContext.Result as ViewResult;
        if (result != null)
        {
            result.MasterName = "<layout>"
        }
    }
}

所以我的问题是:有没有办法在视图外修改 Layout 变量,以便我可以将不同的布局应用于共享视图?

编辑:我的区域内有一个级联布局系统。因此,该区域的 _viewstarts 中的布局页面指向基本共享文件夹中的主布局。

管理区共享布局(_manageLayout.cshtml),在_viewstart.cshtml

中引用
@{
   Layout = "_baseLayout"
}
<htmlstuff>
    @renderbody()
</htmlstuff>

共享基本布局(_baseLayout.cshtml)

<html>
<head>
</head>
<body>
<!-- HTML STUFF -->
    @renderbody()
</body>
</html>

以下方式不能完全回答您的问题,但可能会有所帮助。

  • 为每个区域创建共享视图。
  • 使用分部视图或视图组件渲染实际的共享视图 该区域的共享视图。
  • 在操作中使用区域的共享视图。

区域示例:

_ViewStart.cshtml:

@{
    Layout = "_AreaLayout";
}

_SharedView.cshtml:

@Html.Partial("~/Views/Shared/_SharedView.cshtml", Model);

操作方法:

public ActionResult SharedView()
{
    var model = ... // 
    return View("~/Areas/<AreaName>/Views/Shared/_SharedView.cshtml", model);
}

如果您查看 RazorViewEngine 的源代码,您会发现第 416 行指出它根据视图的相对路径加载 ViewStartPage。由于您的视图位于根视图文件夹中,因此加载了根 ViewStart,因此加载了根的布局,而不是区域布局,即使您实际上在一个区域中也是如此。

您可以按如下方式覆盖它:

~/Views/Shared/TestSharedRoot.cshtml

@{
    if (ViewData.ContainsKey("_MasterLayout"))
    {
        Layout = ViewData["_MasterLayout"] as string;
    }
}
//...

~/Areas/Manage/Controllers/HomeController.cs

public IActionResult Test()
{
    ViewData["_MasterLayout"] = "_ManageLayout";
    return View("TestSharedRoot");
}

现在 Test 操作将显示带有管理布局的根视图,当从根控制器调用时,它只会显示默认布局。