private HttpParameterBinding DetermineBinding(HttpParameterDescriptor parameter) { HttpConfiguration config = parameter.Configuration; var attr = new ModelBinderAttribute(); // use default settings ModelBinderProvider provider = attr.GetModelBinderProvider(config); IModelBinder binder = provider.GetBinder(config, parameter.ParameterType); // Alternatively, we could put this ValueProviderFactory in the global config. var valueProviderFactories = new List<ValueProviderFactory>(attr.GetValueProviderFactories(config)) { new BodyValueProviderFactory() }; return new ModelBinderParameterBinding(parameter, binder, valueProviderFactories); }
/// <summary> /// Gets the binding for a parameter. /// </summary> /// <param name="parameter">The parameter to bind.</param> /// <returns> /// The <see cref="T:System.Web.Http.Controllers.HttpParameterBinding" />that contains the binding. /// </returns> public override HttpParameterBinding GetBinding(HttpParameterDescriptor parameter) { if (parameter == null) { throw Error.ArgumentNull("parameter"); } IModelBinder binder = _provider.GetBinder(parameter.Configuration, parameter.ParameterType); IEnumerable <ValueProviderFactory> valueProviderFactories = GetValueProviderFactories(parameter.Configuration); return(new ModelBinderParameterBinding(parameter, binder, valueProviderFactories)); }
/// <summary> /// Gets the binding for a parameter. /// </summary> /// <param name="parameter">The parameter to bind.</param> /// <returns> /// The <see cref="T:System.Web.Http.Controllers.HttpParameterBinding" />that contains the binding. /// </returns> public override HttpParameterBinding GetBinding(HttpParameterDescriptor parameter) { if (parameter == null) { throw Error.ArgumentNull("parameter"); } IModelBinder binder = _provider.GetBinder(parameter.Configuration, parameter.ParameterType); if (binder == null) { throw Error.Argument("parameter", SRResources.FromODataUriRequiresPrimitive, parameter.ParameterType.FullName); } IEnumerable <ValueProviderFactory> valueProviderFactories = GetValueProviderFactories(parameter.Configuration); return(new ModelBinderParameterBinding(parameter, binder, valueProviderFactories)); }
/// <summary> /// Deserialize the form data to the given type, using model binding. /// </summary> /// <param name="formData">collection with parsed form url data</param> /// <param name="type">target type to read as</param> /// <param name="modelName">null or empty to read the entire form as a single object. This is common for body data. /// <param name="requiredMemberSelector">The <see cref="IRequiredMemberSelector"/> used to determine required members.</param> /// <param name="formatterLogger">The <see cref="IFormatterLogger"/> to log events to.</param> /// Or the name of a model to do a partial binding against the form data. This is common for extracting individual fields.</param> /// <returns>best attempt to bind the object. The best attempt may be null.</returns> public static object FixedReadAs(this FormDataCollection formData, Type type, string modelName, IRequiredMemberSelector requiredMemberSelector, IFormatterLogger formatterLogger) { if (formData == null) { throw Error.ArgumentNull("formData"); } if (type == null) { throw Error.ArgumentNull("type"); } if (modelName == null) { modelName = string.Empty; } using (HttpConfiguration config = new HttpConfiguration()) { bool validateRequiredMembers = requiredMemberSelector != null && formatterLogger != null; if (validateRequiredMembers) { // Set a ModelValidatorProvider that understands the IRequiredMemberSelector config.Services.Replace(typeof(ModelValidatorProvider), new RequiredMemberModelValidatorProvider(requiredMemberSelector)); } // Looks like HttpActionContext is just a way of getting to the config, which we really // just need to get a list of modelbinderPRoviders for composition. HttpActionContext actionContext = CreateActionContextForModelBinding(config); IValueProvider vp = formData.GetJQueryValueProvider(); ModelBindingContext ctx = CreateModelBindingContext(actionContext, modelName, type, vp); ModelBinderProvider modelBinderProvider = CreateModelBindingProvider(actionContext); IModelBinder binder = modelBinderProvider.GetBinder(config, type); bool haveResult = binder.BindModel(actionContext, ctx); // Log model binding errors if (formatterLogger != null) { foreach (KeyValuePair <string, ModelState> modelStatePair in actionContext.ModelState) { foreach (ModelError modelError in modelStatePair.Value.Errors) { if (modelError.Exception != null) { formatterLogger.LogError(modelStatePair.Key, modelError.Exception); } else { formatterLogger.LogError(modelStatePair.Key, modelError.ErrorMessage); } } } } if (haveResult) { return(ctx.Model); } return(MediaTypeFormatter.GetDefaultValueForType(type)); } }