我正在使用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,但是,這並不覺得自己是正確的方式做到這一點。達到此目的的最佳方式是什麼?你能告訴我在做這件事的時候是否有什麼缺點?
在此先感謝!
不,被'Html.RenderAction()調用的動作是用Authorize屬性裝飾的動作。它必須是這樣的,因爲可以從瀏覽器中直接調用相同的動作。 –