Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/307.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/asp.net-mvc/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何根据角色加载不同的_layout.cshtml?_C#_Asp.net Mvc_Asp.net Mvc 4_Razor - Fatal编程技术网

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

C# 如何根据角色加载不同的_layout.cshtml?,c#,asp.net-mvc,asp.net-mvc-4,razor,C#,Asp.net Mvc,Asp.net Mvc 4,Razor,我的应用程序将有不同的角色,其中一个角色是全局管理员,可以选择添加用户、添加公司等 我买的模板有一个_layout.cshtml,但是我需要它根据用户的角色加载不同的模板 一个有非常不同菜单的 我的视图开始 @{ Layout = "~/Views/Shared/_Layout.cshtml"; } 和my layouts.cshtml <!DOCTYPE html> <html> <head> <meta http-equiv="Conten

我的应用程序将有不同的角色,其中一个角色是全局管理员,可以选择添加用户、添加公司等

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

一个有非常不同菜单的

我的视图开始

@{
    Layout = "~/Views/Shared/_Layout.cshtml";
}
和my 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>

INSPINIA |@ViewBag.Title
@如果(已定义(“样式”))
{@RenderSection(“样式”,必需:false)}
@style.Render(“~/font/css”)
@style.Render(“~/Content/css”)
@Html.Partial(“\u SkinConfig”)
@Html.Partial(“\u导航”)
@Html.Partial(“\u TopNavbar”)
@RenderBody()
@Html.Partial(“\u Footer”)
@Html.Partial(“_RightSidebar”)
@Scripts.Render(“~/bundles/jquery”)
@Scripts.Render(“~/bundles/bootstrap”)
@Scripts.Render(“~/plugins/slimScroll”)
@Scripts.Render(“~/bundles/inspinia”)
@Scripts.Render(“~/bundles/skinConfig”)
@RenderSection(“脚本”,必需:false)
一切都很完美,但我需要创建另一个layouts.cshtml,并引用不同的导航部分视图,这就是问题所在


当用户属于特定角色时,如何使应用程序加载该特定layouts.csthml?

您可以使用该区域。实现AreaRegistration抽象类是一个良好的开端。在Global.asax中,应用程序_Start()注册您拥有的所有区域

AreaRegistration.RegisteralAreas()

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

本教程很好,但所有内容都在一个项目中,我喜欢不同的项目

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

如果只是布局的一个特定部分,您可以使用Razor。把这个放在菜单代码的地方。。。(可能是在_导航中):

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

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

您可以通过使用自定义actionresult,甚至可能是action筛选器来自动执行最后一种方法。

您可以将布局分为两部分,一部分用于普通用户,另一部分用于管理员。 然后,有两种或三种方法可以按照使用_ViewStart.cshtml中的指定,或在视图中指定布局,或通过操作结果来呈现这些布局。

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

如果您不喜欢使用第三方库,另一个选项是对进行反向工程,以构建基于MVC
authorized属性的您自己的系统

全面披露

我是
MvcSiteMapProvider的主要贡献者

这篇文章是否有帮助:@if(@Session[“LogedUserTypeID”].ToString()=“0”)//管理权限{
  • }
    string layoutName = Roles.IsUserInRole("GlobalAdmin") ? "_LayoutAdmin" : "_Layout";
    return View(model, layoutName);