asp.net-core-mvc - 如何在 ASP.NET Core MVC 中指定不同的布局

标签 asp.net-core-mvc

我想在我的应用程序中有 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/

相关文章:

c# - .NET Core 中的 WebUtility.HtmlDecode 替换

c# - ASP.NET Core 5 错误 “An error occurred while processing your request”

c# - Angular Web Api 2 不适用于 POST : 405 Method Not Allowed

ASP.NET MVC 6 (vNext) 未正确链接到文件

c# - 我如何使用标签助手来获取任意元素上的模型属性名称?

c# - 简单注入(inject)器 - 在运行时根据指定的泛型类型注入(inject)服务

c# - Asp.net core cookie 身份验证请求过多

c# - gRPC 与 Asp.net Core Mvc 一起运行

c# - 如何在 Entity Framework Core 1.0 RTM 中关闭级联删除

c# - 除非我重新启动 IIS Express,否则 ASP.Net 5/MVC6 Razor View 不会随着浏览器的更改而更新