修改视图外的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
操作将显示带有管理布局的根视图,当从根控制器调用时,它只会显示默认布局。
我在共享文件夹中有一个视图,我正在多个区域使用它。我现在面临的问题是该区域 _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
操作将显示带有管理布局的根视图,当从根控制器调用时,它只会显示默认布局。