修改视图外的剃刀布局

时间:2016-06-30 09:41:45

标签: razor asp.net-core asp.net-core-1.0

我在共享文件夹中有一个视图,我在几个区域中使用它。我现在面临的问题是该区域的_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>

2 个答案:

答案 0 :(得分:3)

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

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

<强>〜/查看/共享/ TestSharedRoot.cshtml

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

<强>〜/地区/管理/控制器/ HomeController.cs

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

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

答案 1 :(得分:-2)

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

  • 为每个区域创建一个共享视图。
  • 使用部分视图或视图组件来呈现实际的共享视图 该地区的共同观点。
  • 在操作中使用区域的共享视图。

区域示例:

_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);
}