2012-12-07 31 views
9

Simon發佈了這個優秀的博客post後,我發現模型綁定比過濾器執行(甚至在授權過濾器之前)發生得早。如果請求未被授權,則應儘早拒絕該請求,在這種情況下,我更願意在模型綁定過程之前運行授權過濾器。另外,通過這種方式,我們可以節省時間,避免掃描請求,創建模型實例並執行驗證。爲什麼模型綁定比過濾器更早發生

是否有任何理由,我簡直不明白爲什麼MVC請求處理管道的設計,使模型綁定應該發生在過濾器之前?

回答

7

在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 
}