私はMVC 5を使用していますが、Html.RenderAction()経由でビューからアクションを呼び出しています。私はアクションのIDパラメータを渡したいと私はそうのようにそれを行う:public ActionResult MyAction(int id)
RenderActionからRouteDataをアクション属性に渡す方法
これは正常に動作します: Html.RenderAction("MyAction", "MyController", new { id = resourceID });
自分の行動がこのようなものです。しかし、私は自分のカスタムAuthorizeAttributeでアクションを修飾して、現在のユーザーがこの特定のIDを持つリソースにアクセスできるかどうかをチェックしたいと思います。
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要求は、そうresourceID
がここにnullになりますidパラメータが含まれていないということです。私のカスタムAuthorizeAttributeクラスでは、私はこのようなものを持っています。この問題を回避するために、私はRenderActionを呼び出す前に、リクエストにこのパラメータを追加し、次のように:
Context.Request.RequestContext.RouteData.Values["id"] = resourceID;
Html.RenderAction("MyAction", "MyController", new { id = resourceID });
今、私はAuthorizeAttribute内IDを取得することができますが、これは正しい方法のように感じることはありません。それをやる。これを達成する最良の方法は何ですか?そして、私がそれをやっている途中に欠点があるかどうか教えていただけますか?
ありがとうございます!
いいえ、 'Html.RenderAction()'によって呼び出されたアクションは、Authorize属性で修飾されたアクションです。同じアクションがブラウザからうっかり呼び出される可能性があるため、このようにする必要があります。 –