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



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

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

然后在我的控制器

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

这很好。现在我想检查用户是否有权限查看那个部分视图。所以我想检查ActionFilter onactionexecution

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。当用户没有部分请求的权限时,结果为空,但部分视图仍然加载。我应该在控制器/视图中检查什么来隐藏/阻止加载部分视图?

您可以在

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

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

和"主视图"数据可以在filterContext.HttpContext.Request.RequestContext.RouteDate为例

编辑

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

filterContext.Result = new EmptyResult();
return;

代替filterContext.Result = null;

如果你想在你的过滤器中获得控制器和动作名称,你可以这样做:

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

ChildActions在一个动作中执行。您还使用了Attribute ChildActionOnly,这使得它不可用,直到这些子操作所处的操作执行。所以你只需要确保你的主要动作。

如果你想根据权限呈现子操作,你需要在视图中这样处理它:

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

最新更新