如何根据角色加载不同的_layout.cshtml?

时间:2015-05-29 20:17:05

标签: c# asp.net-mvc asp.net-mvc-4 razor

我的应用程序将具有不同的角色,一个角色将是全局管理员,其中包含添加用户,添加公司等选项。

我买的模板有一个_layout.cshtml,但我需要根据用户的角色加载不同的模板。

一个菜单非常不同。

我的观察开始

@{
    Layout = "~/Views/Shared/_Layout.cshtml";
}

和我的layouts.cshtml

<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
    <meta charset="utf-8" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">

    <title>INSPINIA | @ViewBag.Title</title>

    <link href='https://fonts.googleapis.com/css?family=Open+Sans:400,300,600,700' rel='stylesheet' type='text/css'>
    <!-- Add local styles, mostly for plugins css file -->
    @if (IsSectionDefined("Styles"))
        {@RenderSection("Styles", required: false)}

    <!-- Add jQuery Style direct - used for jQGrid plugin -->
    <link href="@Url.Content("~/Scripts/plugins/jquery-ui/jquery-ui.css")" rel="stylesheet" type="text/css" />

    <!-- Primary Inspinia style -->     
    @Styles.Render("~/font-awesome/css")                                                
    @Styles.Render("~/Content/css")
</head>
<body>

    <!-- Skin configuration box -->
    @Html.Partial("_SkinConfig")

    <!-- Wrapper-->
    <!-- PageClass give you ability to specify custom style for specific view based on action -->
    <div id="wrapper" class="@Html.PageClass()">

        <!-- Navigation -->
        @Html.Partial("_Navigation")

        <!-- Page wraper -->
        <div id="page-wrapper" class="gray-bg @ViewBag.SpecialClass">

            <!-- Top Navbar -->
            @Html.Partial("_TopNavbar")

            <!-- Main view  -->
            @RenderBody()

            <!-- Footer -->
            @Html.Partial("_Footer")

        </div>
        <!-- End page wrapper-->

        <!-- Right Sidebar -->
        @Html.Partial("_RightSidebar")

    </div>
    <!-- End wrapper-->

    <!-- Section for main scripts render -->
    @Scripts.Render("~/bundles/jquery")
    @Scripts.Render("~/bundles/bootstrap")
    @Scripts.Render("~/plugins/slimScroll")
    @Scripts.Render("~/bundles/inspinia")

    <!-- Skin config script - only for demo purpose-->
    @Scripts.Render("~/bundles/skinConfig")

    <!-- Handler for local scripts -->
    @RenderSection("scripts", required: false)
</body>
</html>

一切都很完美,但我需要创建另一个layouts.cshtml,引用不同的导航局部视图,以及问题所在的地方,

当用户属于特定角色时,如何让应用加载特定的layouts.csthml?

4 个答案:

答案 0 :(得分:3)

此答案假设您在MVC4中使用SimpleMembership的默认角色管理器:

如果它只是布局的特定部分,您可以使用Razor。把它放在菜单代码的位置......(可能在_Navigation中):

@if (Roles.IsUserInRole("GlobalAdmin"))
{
    @Html.ActionLink("Admin only link", "ActionName", "ControllerName")
    @Html.ActionLink("Another admin link", "ActionName", "ControllerName")
}

如果来自特定的操作方法,您可以指定布局:

string layoutName = Roles.IsUserInRole("GlobalAdmin") ? "_LayoutAdmin" : "_Layout";
return View(model, layoutName);

您可以使用自定义动作结果甚至是动作过滤器自动执行最后一种方法。

答案 1 :(得分:1)

您可以使用区域。实现AreaRegistration抽象类类是一个好的开始。在Global.asax中,Application_Start()会注册您拥有的所有区域

AreaRegistration.RegisterAllAreas()

有两个MVC项目说一个Something.Admin,另一个Something.Web

本教程很好,但一切都在一个项目中,我喜欢不同的项目 http://www.codeproject.com/Articles/714356/Areas-in-ASP-NET-MVC

答案 2 :(得分:0)

您可以将布局分为两部分,一部分用于普通用户,另一部分用于管理员。 然后有两种或三种类型的方法来使用_ViewStart.cshtml在this article中指定这些布局,或者在View中或通过Action结果指定布局。

答案 3 :(得分:0)

一种选择是使用MvcSiteMapProvider和附带的security trimming功能来显示/隐藏不同的菜单选项,具体取决于登录的用户。它基于MVC AuthorizeAttribute或任何它的子类,因此它将支持您可能已经定义的用户,角色或自定义安全声明的任意组合。

如果您不想使用第三方库,另一个选择是对AuthorizeAttributeAclModule进行反向工程,以构建基于MVC AuthorizeAttribute的自己的系统。

完全披露

我是MvcSiteMapProvider的主要撰稿人。