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
}