Asp.net-Mvc

為什麼模型綁定比過濾器更早發生

  • December 7, 2012

在閱讀了 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
}

引用自:https://stackoverflow.com/questions/13765393