在MVC中,如何使用控制器仅为已批准的用户呈现部分视图?

时间:2015-06-09 21:51:48

标签: c# asp.net-mvc asp.net-mvc-5

在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");            
    }

查看阻止:

<div class="rowWithCols3">
@Html.Partial("MonitorCSU")

迭代失败:

  • 在控制器块中,我尝试(未成功)使用if-then块,else情况是另一个没有内容的局部视图。

    [ChildActionOnly]
        public ActionResult MonitorCSU()     {         if(User.IsInRole(“Domain \ GroupA”)){         返回PartialView(“_ MonitorCSU”);         }         其他         {             返回PartialView(“_ Unauthorized”);         }     }

  • 在Razor中,我尝试使用HTML.Action但是当我尝试运行页面时,浏览器挂起了无限循环。

3 个答案:

答案 0 :(得分:6)

@Html.Partial()返回局部视图而不调用控制器方法。要调用控制器方法,需要使用

@Html.Action("MonitorCSU")

@{ Html.RenderAction("MonitorCSU") }

请注意,这假设MonitorCSU()方法与生成主视图的方法位于同一控制器中(另外,您还需要包含控制器名称的参数)

Refer documentation

答案 1 :(得分:2)

虽然您已找到解决方案,但您将遇到其他问题。我建议使用另一种方法,即使用EditorTemplates并为要渲染的html创建单独的模型。然后,在运行时,您将检查用户是否在您指定的组中,如果是,则创建模型的实例,如果不是,则将模型保留为null。这样,当使用EditorFor()呈现视图时,它将忽略并且不为没有访问权限的用户呈现模板。

答案 2 :(得分:1)

感谢@Stephen Muecke以及一位神秘消失的评论者,我丢失了部分。

我能够使用多个真实用户测试此代码,并验证所需行为是否始终如一。

控制器阻止: 主要区别:取出授权并使用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

<div class="rowWithCols3">
@Html.Action("MonitorCSU")