在MVC中,如何使用控制器仅为已批准的用户呈现部分视图?
在MVC 5中,我尝试仅在(Windows Authenticated)用户属于一个或多个Active Directory组列表时才使用控制器呈现部分视图。 我需要考虑30多个不同的小组,所以“你好世界”的例子不符合我的需要。 在网上玩清道夫之后,我设法收集了这么多。 没有编译或运行时错误,但内容显示给所有用户而不是特定用户。 因此,尚未实现预期的结果。
虽然我可以在视图中使用if-then逻辑来实现期望的结果,但它会产生大量不必要的重复并鼓励spaghettification。 所以我试图在控制器中执行此操作。
期望结果摘要:
当用户加载视图时,仅当Windows Authenticated用户属于控制器操作中定义的一个或多个组列表时,才应呈现局部视图。 如果用户未获得授权,则不包括部分视图。
控制器块:
[ChildActionOnly] [Authorize(Roles="Domain\\GroupA,Domain\\GroupB")] public ActionResult MonitorCSU() { return PartialView("MonitorCSU"); }
查看块:
@Html.Partial("MonitorCSU")
不成功的迭代:
-
在控制器块中,我尝试(不成功)使用if-then块,else情况是另一个没有内容的局部视图。
[ChildActionOnly]
public ActionResult MonitorCSU(){if(User.IsInRole(“Domain \ GroupA”)){return PartialView(“_ MonitorCSU”); } else {return PartialView(“_ Unauthorized”); }}
-
在Razor中,我尝试使用HTML.Action但是当我尝试运行页面时,浏览器挂起了无限循环。
@Html.Partial()
返回部分视图而不调用控制器方法。 要调用控制器方法,需要使用
@Html.Action("MonitorCSU")
要么
@{ Html.RenderAction("MonitorCSU") }
请注意,这假设MonitorCSU()
方法与生成主视图的方法位于同一控制器中(另外,您还需要包含控制器名称的参数)
参考文档
虽然您已找到解决方案,但您将遇到其他问题。 我建议使用另一种方法,即使用EditorTemplates并为要渲染的html创建单独的模型。 然后,在运行时,您将检查用户是否在您指定的组中,如果是,则创建模型的实例,如果不是,则将模型保留为null。 这样,当使用EditorFor()呈现视图时,它将忽略并不为没有访问权限的用户呈现模板。
感谢@Stephen Muecke以及一位神秘消失的评论者,我丢失了一些东西。
我能够使用几个真实用户测试此代码,并validation所需的行为是否始终如一。
控制器块: 主要区别:取出授权并使用if-then块发送两个部分视图之一。
[ChildActionOnly] public ActionResult MonitorCSU() { if (User.IsInRole("DOMAIN\\GroupA")) { return PartialView("MonitorCSU"); } else { return PartialView("Unauthorized"); // this is an empty page } }
视图块: 关键区别在于使用HTML.Action
@Html.Action("MonitorCSU")
- 使用Razor在POST上使用Model.List为null
- 如何从Request.Form获取所有元素值,而无需使用.GetValues(“ElementIdName”)确切指定哪个元素值
- 如何在ASP.NET MVC 4 Web API中测试自定义DelegatingHandler?
- 使用Flags枚举时如何减少ASP.NET MVC视图中的代码重复
- 使用Linq返回查询中的项目计数及其结果集
- ‘System.Web.Mvc.HtmlHelper’不包含’RenderPartial’的定义 – ASP.Net MVC
- Posttorial:ASP.NET MVC,entity framework和LINQvideo教程 – 包括MIX09,PDC,TechED
- ASP.Net MVC中的LDAP身份validation
- ASP.NET MVC 6中MVC Controller和Web API Controller有什么区别?
Interesting Posts