在阅读了 Simon 的这篇出色的博客文章之后,我开始知道模型绑定发生在过滤器执行之前(甚至在授权过滤器之前)。如果请求未获得授权,则应尽早拒绝它,在这种情况下,我更喜欢在模型绑定过程之前运行授权过滤器。此外,通过这种方式,我们可以节省时间,避免扫描请求、创建模型实例和执行验证。
有什么理由我根本不明白为什么 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
}