ASP.NET MVC Core中的多个布局

时间:2017-01-25 10:41:53

标签: asp.net asp.net-core-mvc

在我们的ASP.NET核心应用程序中,我们有几个角色,我们希望每个角色都有自己的布局,为此,我们想出了为每个角色分别布局的想法:

~/Views/Shared/Layouts/_DefaultLayout.cshtml
~/Views/Shared/Layouts/_Role_1_Layout.cshtml
~/Views/Shared/Layouts/_Role_2_Layout.cshtml
~/Views/Shared/Layouts/_Role_3_Layout.cshtml
~/Views/Shared/Layouts/_Role_4_Layout.cshtml

要在这些角色之间切换,我们会将~/Views/_ViewStart.cshtml修改为:

@{
    if (this.User.IsInRole("Role1"))
    {
        Layout = "~/Views/Shared/Layouts/_Role_1_Layout.cshtml";
    }
    else if (this.User.IsInRole("Role2"))
    {
        Layout = "~/Views/Shared/Layouts/_Role_2_Layout.cshtml";
    }

    // ....

    else
    {
        Layout = "~/Views/Shared/_DefaultLayout.cshtml";
    }
}

这首先适用,但当我使用例如Role1的其他用户登录时,它不会将当前布局切换为使用_Role_1_Layout.cshtml,而是显示空白页面。

有什么想法吗?

2 个答案:

答案 0 :(得分:1)

看起来你适合'其他',但路径上有错误?

  

Layout =“〜/ Views / Shared / _DefaultLayout.cshtml”;

可能应该是:

  

Layout =“〜/ Views / Shared / Layouts / _DefaultLayout.cshtml”;

我这不是您问题的原因,您可以与您的代码或至少工作示例共享回购吗?

答案 1 :(得分:0)

只需将Layout设置为布局的名称,而不是布局的路径:

  if (this.User.IsInRole("Role1"))
    {
        Layout = "_Role_1_Layout";
    }

....