Ejemplo n.º 1
0
	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);
	}
Ejemplo n.º 2
0
        /// <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));
        }
Ejemplo n.º 3
0
        /// <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));
            }
        }