为什么模型绑定比过滤器更早发生

时间:2012-12-07 14:48:16

标签: asp.net-mvc authorization model-binding action-filter

在Simon发表这篇优秀的博客post后,我发现模型绑定比过滤器执行更早发生(甚至在授权过滤器之前)。如果请求未被授权,则应尽可能早地拒绝该请求,在这种情况下,我更喜欢在模型绑定过程之前运行授权过滤器。此外,通过这种方式,我们可以节省时间,避免扫描请求,创建模型实例和执行验证。

有什么理由我根本不明白为什么MVC请求处理管道的设计方式应该在过滤器之前进行模型绑定?

1 个答案:

答案 0 :(得分: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
}