我正在使用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,但是,这并不是正确的方法。实现这一目标的最佳方法是什么?你能否告诉我,我做这件事的方式是否有任何缺点?
提前致谢!
答案 0 :(得分:0)
如果我理解正确:
Html.Action
Html.Action
方法的视图Html.RenderAction("MyAction", "MyController", new { id = resourceID })
调用的操作使用自定义授权属性进行修饰,以检查用户是否有权访问它如果我的理解是正确的,那么我不会实现额外的authorize属性,但是在Html.Action
调用的操作中检查用户是否被授权,如果没有修改返回的视图,那么{{1}}将不会被召唤。