C# 如何根据角色加载不同的_layout.cshtml?
我的应用程序将有不同的角色,其中一个角色是全局管理员,可以选择添加用户、添加公司等 我买的模板有一个_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 = "~/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);