public async Task <ModelBindingResult> BindModelAsync(ModelBindingContext bindingContext) { if (bindingContext.BinderType == null) { // Return null so that we are able to continue with the default set of model binders, // if there is no specific model binder provided. return(null); } var requestServices = bindingContext.OperationBindingContext.HttpContext.RequestServices; var createFactory = _typeActivatorCache.GetOrAdd(bindingContext.BinderType, _createFactory); var instance = createFactory(requestServices, arguments: null); var modelBinder = instance as IModelBinder; if (modelBinder == null) { var modelBinderProvider = instance as IModelBinderProvider; if (modelBinderProvider != null) { modelBinder = new CompositeModelBinder(modelBinderProvider.ModelBinders); } else { throw new InvalidOperationException( Resources.FormatBinderType_MustBeIModelBinderOrIModelBinderProvider( bindingContext.BinderType.FullName, typeof(IModelBinder).FullName, typeof(IModelBinderProvider).FullName)); } } var result = await modelBinder.BindModelAsync(bindingContext); var modelBindingResult = result != null ? new ModelBindingResult(result.Model, result.Key, result.IsModelSet) : new ModelBindingResult(model: null, key: bindingContext.ModelName, isModelSet: false); // A model binder was specified by metadata and this binder handles all such cases. // Always tell the model binding system to skip other model binders i.e. return non-null. return(modelBindingResult); }
public async Task<ModelBindingResult> BindModelAsync(ModelBindingContext bindingContext) { if (bindingContext.BinderType == null) { // Return null so that we are able to continue with the default set of model binders, // if there is no specific model binder provided. return null; } var requestServices = bindingContext.OperationBindingContext.HttpContext.RequestServices; var createFactory = _typeActivatorCache.GetOrAdd(bindingContext.BinderType, _createFactory); var instance = createFactory(requestServices, arguments: null); var modelBinder = instance as IModelBinder; if (modelBinder == null) { var modelBinderProvider = instance as IModelBinderProvider; if (modelBinderProvider != null) { modelBinder = new CompositeModelBinder(modelBinderProvider.ModelBinders); } else { throw new InvalidOperationException( Resources.FormatBinderType_MustBeIModelBinderOrIModelBinderProvider( bindingContext.BinderType.FullName, typeof(IModelBinder).FullName, typeof(IModelBinderProvider).FullName)); } } var result = await modelBinder.BindModelAsync(bindingContext); var modelBindingResult = result != null ? new ModelBindingResult(result.Model, result.Key, result.IsModelSet) : new ModelBindingResult(model: null, key: bindingContext.ModelName, isModelSet: false); // A model binder was specified by metadata and this binder handles all such cases. // Always tell the model binding system to skip other model binders i.e. return non-null. return modelBindingResult; }
public async Task <bool> BindModelAsync(ModelBindingContext bindingContext) { if (bindingContext.ModelMetadata.BinderType == null) { // Return false so that we are able to continue with the default set of model binders, // if there is no specific model binder provided. return(false); } var requestServices = bindingContext.OperationBindingContext.HttpContext.RequestServices; var instance = _typeActivator.CreateInstance(requestServices, bindingContext.ModelMetadata.BinderType); var modelBinder = instance as IModelBinder; if (modelBinder == null) { var modelBinderProvider = instance as IModelBinderProvider; if (modelBinderProvider != null) { modelBinder = new CompositeModelBinder(modelBinderProvider.ModelBinders); } else { throw new InvalidOperationException( Resources.FormatBinderType_MustBeIModelBinderOrIModelBinderProvider( bindingContext.ModelMetadata.BinderType.FullName, typeof(IModelBinder).FullName, typeof(IModelBinderProvider).FullName)); } } await modelBinder.BindModelAsync(bindingContext); // return true here, because this binder will handle all cases where the model binder is // specified by metadata. return(true); }