Asp.net-Mvc
為什麼模型綁定比過濾器更早發生
在閱讀了 Simon 的這篇出色的部落格文章之後,我開始知道模型綁定發生在過濾器執行之前(甚至在授權過濾器之前)。如果請求未獲得授權,則應儘早拒絕它,在這種情況下,我更喜歡在模型綁定過程之前執行授權過濾器。此外,通過這種方式,我們可以節省時間,避免掃描請求、創建模型實例和執行驗證。
有什麼理由我根本不明白為什麼 MVC 請求處理管道的設計方式是模型綁定應該在過濾器之前發生?
在 asp.net mvc3 中,授權過濾器在模型綁定之前執行,而不是之後(參見下面的程式碼)。
模型綁定發生在過濾器之前,因為 ActionExecutingContext(IActionFilter.OnActionExecuting 的參數)包含操作的參數。也許他們應該延遲載入這些參數。
以下程式碼來自 System.Web.Mvc.ControllerActionInvoker。
public virtual bool InvokeAction(ControllerContext controllerContext, string actionName) { // code removed for brevity try { // Notice the authorization filters are invoked before model binding AuthorizationContext authContext = InvokeAuthorizationFilters(controllerContext, filterInfo.AuthorizationFilters, actionDescriptor); if (authContext.Result != null) { // the auth filter signaled that we should let it short-circuit the request InvokeActionResult(controllerContext, authContext.Result); } else { if (controllerContext.Controller.ValidateRequest) { ValidateRequest(controllerContext); } // GetParameterValues does the model binding IDictionary<string, object> parameters = GetParameterValues(controllerContext, actionDescriptor); ActionExecutedContext postActionContext = InvokeActionMethodWithFilters(controllerContext, filterInfo.ActionFilters, actionDescriptor, parameters); InvokeActionResultWithFilters(controllerContext, filterInfo.ResultFilters, postActionContext.Result); } } // code removed for brevity }