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

4 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");            
    }
Run Code Online (Sandbox Code Playgroud)

查看块:

<div class="rowWithCols3">
@Html.Partial("MonitorCSU")
Run Code Online (Sandbox Code Playgroud)

不成功的迭代:

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

    [ChildActionOnly]
    public ActionResult MonitorCSU(){if(User.IsInRole("Domain\GroupA")){return PartialView("_ MonitorCSU"); } else {return PartialView("_ Unauthorized"); }}

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

小智 6

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

@Html.Action("MonitorCSU")
Run Code Online (Sandbox Code Playgroud)

要么

@{ Html.RenderAction("MonitorCSU") }
Run Code Online (Sandbox Code Playgroud)

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

参考文档