如何在ASP.NET Core MVC中指定不同的布局

Was*_*ter 17 asp.net-core-mvc

我希望在我的应用程序中有2个单独的布局.假设一个是网站的公共部分,另一个是空的,原因我们需要.

在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;
        }
    }
Run Code Online (Sandbox Code Playgroud)

}

现在ViewResult没有MasterName属性.是否可以立即执行,而不是在查看布局定义中使用.

Dan*_*.G. 27

您仍然可以执行与原始方法非常相似的操作,使用ViewData传递布局名称(虽然我将其创建为结果过滤器):

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;
        }
    }        
}
Run Code Online (Sandbox Code Playgroud)

然后在_ViewStart.cshtml文件中:

@{
    Layout = (string)ViewData["Layout"] ?? "_Layout";
}
Run Code Online (Sandbox Code Playgroud)

最后,假设您创建了一个新的布局Views/Shared/_CleanLayout.cshtml,您可以在任何控制器或操作上使用该属性:

[ViewLayout("_CleanLayout")]
public IActionResult About()
{
    //...
}
Run Code Online (Sandbox Code Playgroud)


San*_*ket 19

这就是我在ASP.NET核心MVC应用程序中使用多个布局的方式.

你可以尝试这样 -

_ViewStart.cshtml指定默认_Layout像这样 -

@{
    Layout = "_Layout";
}
Run Code Online (Sandbox Code Playgroud)

如果您想设置页面特定的布局,那么page.cshtml您可以分配其他视图,如下所示 -

@{
    Layout = "~/Views/Shared/_Layout_2.cshtml";
    ViewData["Title"] = "Page Title";
}
Run Code Online (Sandbox Code Playgroud)

看看这是否有帮助.

  • 适合我,另一种方法似乎是屁股的痛苦. (4认同)
  • 我这样做了,但我不喜欢这样.它不优雅. (2认同)

dem*_*ron 5

如果要根据某些条件使用不同的布局,可以在_ViewStart.cshtml文件中使用以下代码:

@{
    if (some condition)
    {
        Layout = "_Layout1";
    }
    else if (some other condition)
    {
        Layout = "_Layout2";
    }
    etc.
}
Run Code Online (Sandbox Code Playgroud)

我在我的一个项目中使用了它。在我的情况下User.IsInRole("admin"),我的_ViewStart.cshtml文件如下:

@{
    if (User.IsInRole("admin"))
    {
        Layout = "_AdminLayout";
    }
    else
    {
        Layout = "_Layout";
    }
}
Run Code Online (Sandbox Code Playgroud)

由于我的项目中只有两个角色,因此只会导致一种情况,因此,对于我来说,这种解决方法还不错。我希望处于类似情况的人会发现这很有用:)


Xam*_*Dev 0

您可以使用IViewLocationExpander界面来根据需要渲染视图。请参阅此链接Working with IViewLocationExpander in mvc了解更多详细信息

问候,

罗希特