我想在我的应用程序中有 2 个单独的布局。假设一个是网站的公共(public)部分,另一个是空的,出于某些我们需要的原因。
在 Core 之前,我可以这样做来定义一个过滤器:
public class LayoutInjecterAttribute : ActionFilterAttribute
{
private readonly string _masterName;
public LayoutInjecterAttribute(string masterName)
{
_masterName = masterName;
}
public override void OnActionExecuted(ActionExecutedContext filterContext)
{
base.OnActionExecuted(filterContext);
var result = filterContext.Result as ViewResult;
if (result != null)
{
result.MasterName = _masterName;
}
}
}
现在 ViewResult 没有 MasterName 属性。是否可以现在做,而不是在 View 中使用布局定义。
最佳答案
您仍然可以使用 ViewData
执行与原始方法非常相似的操作。传递布局名称(尽管我会将其创建为 Result Filter ):
public class ViewLayoutAttribute : ResultFilterAttribute
{
private string layout;
public ViewLayoutAttribute(string layout)
{
this.layout = layout;
}
public override void OnResultExecuting(ResultExecutingContext context)
{
var viewResult = context.Result as ViewResult;
if (viewResult != null)
{
viewResult.ViewData["Layout"] = this.layout;
}
}
}
然后在
_ViewStart.cshtml
文件:@{
Layout = (string)ViewData["Layout"] ?? "_Layout";
}
最后,假设您创建了一个新布局,如
Views/Shared/_CleanLayout.cshtml
,您可以在任何 Controller 或操作上使用该属性:[ViewLayout("_CleanLayout")]
public IActionResult About()
{
//...
}
关于asp.net-core-mvc - 如何在 ASP.NET Core MVC 中指定不同的布局,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39870298/