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