如何将RouteData从RenderAction传递给Action Attribute

时间:2017-01-26 11:06:36

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

我正在使用MVC 5,并且我通过Html.RenderAction()从View调用Action。我想将一个ID参数传递给Action,我这样做: Html.RenderAction("MyAction", "MyController", new { id = resourceID });

我的行动是这样的:public ActionResult MyAction(int id)

这很好用。但是,我想用我自己的自定义AuthorizeAttribute修饰Action,以检查当前用户是否可以访问具有此特定ID的资源。在我的自定义AuthorizeAttribute类中,我有类似这样的内容:

protected override bool AuthorizeCore(HttpContextBase httpContext)
{
    if (!base.AuthorizeCore(httpContext))
    {
        return false;
    }
    RouteData rd = httpContext.Request.RequestContext.RouteData;
    var resourceID = rd.Values["id"];

    SessionInfo sessionInfo = HttpContext.Current.Session["SessionInfo"] as SessionInfo;
    int userID = sessionInfo.UserInfo.UserID;
    return AuthorizationBusiness.DoesUserHaveAccessToResource(userID, int.Parse(resourceID.ToString()));
}

问题是原始的Http请求不包含id参数,因此resourceID在这里将为null。为了解决这个问题,我在调用RenderAction之前将此参数添加到Request中,如下所示:

Context.Request.RequestContext.RouteData.Values["id"] = resourceID;
Html.RenderAction("MyAction", "MyController", new { id = resourceID });

现在我可以在AuthorizeAttribute中检索ID,但是,这并不是正确的方法。实现这一目标的最佳方法是什么?你能否告诉我,我做这件事的方式是否有任何缺点?

提前致谢!

1 个答案:

答案 0 :(得分:0)

如果我理解正确:

  1. 您正在致电Html.Action
  2. 返回一个名为Html.Action方法的视图
  3. Html.RenderAction("MyAction", "MyController", new { id = resourceID })调用的操作使用自定义授权属性进行修饰,以检查用户是否有权访问它
  4. 如果我的理解是正确的,那么我不会实现额外的authorize属性,但是在Html.Action调用的操作中检查用户是否被授权,如果没有修改返回的视图,那么{{1}}将不会被召唤。