2017-01-26 54 views
1

我正在使用MVC 5,並通過Html.RenderAction()從視圖調用Action。我想傳遞一個ID參數來操作,我做它像這樣: Html.RenderAction("MyAction", "MyController", new { id = resourceID });如何將RouteData從RenderAction傳遞到Action屬性

我的行爲是這樣的: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將爲空在這裏。爲了解決這一問題,我加入這個參數來請求調用的RenderAction,這樣才:

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

現在我可以檢索AuthorizeAttribute內的ID,但是,這並不覺得自己是正確的方式做到這一點。達到此目的的最佳方式是什麼?你能告訴我在做這件事的時候是否有什麼缺點?

在此先感謝!

回答

0

如果我理解正確:

  1. 要調用Html.RenderAction("MyAction", "MyController", new { id = resourceID });
  2. 這返回上Html.Action方法被調用
  3. 行動是由Html.Action稱爲與自定義授權屬性爲了裝飾,視圖檢查用戶是否有權訪問

如果我的理解是正確的,那麼我就不會imple請在Html.RenderAction("MyAction", "MyController", new { id = resourceID })調用的動作中檢查用戶是否被授權,如果不修改返回的視圖,以便不調用Html.Action

+0

不,被'Html.RenderAction()調用的動作是用Authorize屬性裝飾的動作。它必須是這樣的,因爲可以從瀏覽器中直接調用相同的動作。 –

相關問題