2017-01-26 13 views
1

私は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を取得することができますが、これは正しい方法のように感じることはありません。それをやる。これを達成する最良の方法は何ですか?そして、私がそれをやっている途中に欠点があるかどうか教えていただけますか?

ありがとうございます!

答えて

0

私が正しく理解していれば:

  1. あなたはこのHtml.Action方法は、するために、カスタム認可属性で飾られているHtml.Actionによって呼び出され
  2. アクションと呼ばれるにビューを返すHtml.RenderAction("MyAction", "MyController", new { id = resourceID });
  3. を呼んでいますユーザーにアクセス権があるかどうかを確認してください。

私の理解が正しい場合、私は実装しません追加のauthorize属性を使用しますが、Html.RenderAction("MyAction", "MyController", new { id = resourceID })によって呼び出されるアクションでは、ユーザが承認されているかどうかをチェックし、返されたビューを変更しない場合はHtml.Actionが呼び出されません。

+0

いいえ、 'Html.RenderAction()'によって呼び出されたアクションは、Authorize属性で修飾されたアクションです。同じアクションがブラウザからうっかり呼び出される可能性があるため、このようにする必要があります。 –

関連する問題