修改视图外部的razor布局
我在共享文件夹中有一个视图,我在几个区域使用它。我现在面临的问题是没有应用该区域的_viewstart.cshtml中的布局 我还尝试了一个独立的布局注入器(代码如下),我在MVC4中使用过,但注入器的问题是MasterName不再可用修改视图外部的razor布局,razor,asp.net-core,asp.net-core-1.0,Razor,Asp.net Core,Asp.net Core 1.0,我在共享文件夹中有一个视图,我在几个区域使用它。我现在面临的问题是没有应用该区域的_viewstart.cshtml中的布局 我还尝试了一个独立的布局注入器(代码如下),我在MVC4中使用过,但注入器的问题是MasterName不再可用 public class LayoutInjecterAttribute : ActionFilterAttribute { public override void OnActionExecuted(ActionExecutedContext filt
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>"
}
}
}
公共类layoutinjectAttribute:ActionFilterAttribute
{
公共覆盖无效OnActionExecuted(ActionExecutedContext筛选器上下文)
{
base.OnActionExecuted(filterContext);
var result=filterContext.result作为ViewResult;
如果(结果!=null)
{
result.MasterName=“”
}
}
}
所以我的问题是:有没有一种方法可以在视图之外修改布局变量,以便我可以将不同的布局应用于共享视图
编辑:我的区域内有一个级联布局系统。因此_视图中的布局页面从该区域指向基本共享文件夹中的主布局的点开始
管理区域中的共享布局(_manageLayout.cshtml),在_viewstart.cshtml中引用
@{
Layout = "_baseLayout"
}
<htmlstuff>
@renderbody()
</htmlstuff>
<html>
<head>
</head>
<body>
<!-- HTML STUFF -->
@renderbody()
</body>
</html>
@{
if (ViewData.ContainsKey("_MasterLayout"))
{
Layout = ViewData["_MasterLayout"] as string;
}
}
//...
@{
布局=“\u基本布局”
}
@renderbody()
共享基本布局(\u baseLayout.cshtml)
@renderbody()
下面的方法并不能完全回答您的问题,但可能会有所帮助
- 为每个区域创建共享视图
- 使用局部视图或视图组件在中渲染实际共享视图 该区域的共享视图
- 在操作中使用区域的共享视图
\u ViewStart.cshtml
:
@{
Layout = "_AreaLayout";
}
@Html.Partial("~/Views/Shared/_SharedView.cshtml", Model);
\u SharedView.cshtml
:
@{
Layout = "_AreaLayout";
}
@Html.Partial("~/Views/Shared/_SharedView.cshtml", Model);
行动方法:
public ActionResult SharedView()
{
var model = ... //
return View("~/Areas/<AreaName>/Views/Shared/_SharedView.cshtml", model);
}
public ActionResult SharedView()
{
var模型=…//
返回视图(“~/Areas//Views/Shared/_SharedView.cshtml”,模型);
}
如果您检查的源代码,您可以看到,在第416行,它表示它根据视图的相对路径加载ViewStartPage。由于视图位于根视图文件夹中,因此加载根视图开始,因此加载的是根视图的布局,而不是区域布局,即使您实际位于某个区域中
您可以按如下方式覆盖它:
~/Views/Shared/TestSharedRoot.cshtml
@{
Layout = "_baseLayout"
}
<htmlstuff>
@renderbody()
</htmlstuff>
<html>
<head>
</head>
<body>
<!-- HTML STUFF -->
@renderbody()
</body>
</html>
@{
if (ViewData.ContainsKey("_MasterLayout"))
{
Layout = ViewData["_MasterLayout"] as string;
}
}
//...
~/Areas/Manage/Controllers/HomeController.cs
public IActionResult Test()
{
ViewData["_MasterLayout"] = "_ManageLayout";
return View("TestSharedRoot");
}
现在,
Test
操作将显示带有管理布局的根视图,当从根控制器调用时,它将只显示默认布局。这是我当前的实现,但这不是一个解决方案。我有几个共享视图,比如配置文件,所以这不是长期的。您是否为操作或控制器设置了[Area(“”)]
?对我来说,它工作正常。它使用区域的_viewstart中的布局。是否也使用不同的布局?为了确保我刚刚创建了一个新项目并再次尝试,但它仍然保留了基本视图的布局,而不是该区域的布局,我对每个区域使用不同的布局。