动作过滤器中的部分视图权限

时间:2016-06-27 07:01:33

标签: asp.net-mvc asp.net-mvc-4

我有两个部分视图在页面上呈现,

  @{Html.RenderAction("SalesDashboard", "Dashboard");}
  @{Html.RenderAction("MarketDashboard", "Dashboard");}

然后在我的控制器中

 [ChildActionOnly]
        public PartialViewResult SalesDashboard()
        {
            return PartialView("_SalesDashboard");
        }

        [ChildActionOnly]
        public PartialViewResult MarketDashboard()
        {
            return PartialView("_MarketDashboard");
        }

这很好用。现在我想检查用户是否有权查看该部分视图。所以我想查看我的ActionFilter OnActionExecuting。

public override void OnActionExecuting(ActionExecutingContext filterContext)
        {
 if (filterContext.IsChildAction) //How to get the partial view request here, I mean the controller name and action method
                    {
                        //business logic
                    }
                    int reqCnt = SessionMenu.Menus.FindIndex(i=> i.AccessPath == filterContext.HttpContext.Request.Url.PathAndQuery);
                    if (reqCnt <= 0)
                    {
                      //business logic
                    }
    }

我想在我的过滤器中获取部分viewrequest路径。任何帮助表示赞赏。提前致谢

请检查更新的操作过滤器,

if (filterContext.IsChildAction)
                    {
                        string cName = filterContext.ActionDescriptor.ControllerDescriptor.ControllerName;
                        string aMthod = filterContext.ActionDescriptor.ActionName;
                        int i = SessionMenu.Menus.FindIndex(item => item.AccessPath == "/"+ cName +"/"+aMthod );
                        if (i <= 0)
                        {
                            filterContext.Result = null;
                        }
                    }
当用户不具有部分请求的权限时,

filterContext.Result为null,但部分视图仍会加载。我应该在我的控制器/视图中检查什么来隐藏/阻止加载局部视图?

3 个答案:

答案 0 :(得分:1)

您可以在

中找到部分操作名称
filterContext.ActionDescriptor.ActionName

中的部分控制器名称
filterContext.ActionDescriptor.ControllerDescriptor.ControllerName

和&#34;主视图&#34;数据可以在 例如filterContext.HttpContext.Request.RequestContext.RouteDate

修改

然后,要跳过执行,你可以

filterContext.Result = new EmptyResult();
return;

而不是filterContext.Result = null;

答案 1 :(得分:0)

如果您想在过滤器中获取控制器和操作名称,可以执行以下操作:

string actionName = filterContext.ActionDescriptor.ActionName;
string controllerName = filterContext.ActionDescriptor.ControllerDescriptor.ControllerName

答案 2 :(得分:0)

ChildActions在行动中被执行。你还使用了属性ChildActionOnly,这使得它不可用,直到这些childacions将执行的动作。所以你只需要确保你的主要行动。

如果您想基于权限呈现子操作,则需要在以下视图上处理它:

@if(HttpContext.Current.User.IsInRole("RoleName"))
{
    @Html.RenderAction("SalesDashboard", "Dashboard")
  @{Html.RenderAction("MarketDashboard", "Dashboard");}
}

@if(HttpContext.Current.User.IsInRole("RoleName"))
{
  @Html.RenderAction("MarketDashboard", "Dashboard");
}