protected override object GetPropertyValue(ControllerContext controllerContext, ModelBindingContext bindingContext,
                                                   PropertyDescriptor propertyDescriptor, IModelBinder propertyBinder)
        {
            // First check if request validation is required
            var shouldPerformRequestValidation = controllerContext.Controller.ValidateRequest && bindingContext.ModelMetadata.RequestValidationEnabled;

            // Get value
            var valueProviderResult = bindingContext.GetValueFromValueProvider(shouldPerformRequestValidation);

            if (valueProviderResult == null)
            {
                return(null);
            }

            if (propertyDescriptor.PropertyType.GetInterface(typeof(IEnumerable).Name) != null)
            {
                //var actualValue = bindingContext.ValueProvider.GetValue(propertyDescriptor.Name);
                var attemptedValue = valueProviderResult.AttemptedValue;

                if (!string.IsNullOrWhiteSpace(attemptedValue) && attemptedValue.Contains(","))
                {
                    var valueType = propertyDescriptor.PropertyType.GetElementType() ??
                                    propertyDescriptor.PropertyType.GetGenericArguments().FirstOrDefault();

                    if (valueType != null && valueType.GetInterface(typeof(IConvertible).Name) != null)
                    {
                        var list = (IList)Activator.CreateInstance(typeof(List <>).MakeGenericType(valueType));

                        foreach (var splitValue in attemptedValue.Split(','))
                        {
                            if (valueType.IsEnum)
                            {
                                try
                                {
                                    list.Add(Enum.Parse(valueType, splitValue));
                                }
                                catch
                                {
                                    // ignored
                                }
                            }
                            else
                            {
                                list.Add(Convert.ChangeType(splitValue, valueType));
                            }
                        }

                        return(propertyDescriptor.PropertyType.IsArray
                            ? ToArrayMethod.MakeGenericMethod(valueType).Invoke(this, new object[] { list })
                            : list);
                    }
                }
            }

            return(base.GetPropertyValue(controllerContext, bindingContext, propertyDescriptor, propertyBinder));
        }
예제 #2
0
        object IModelBinder.BindModel(ControllerContext controllerContext, ModelBindingContext bindingContext)
        {
            // First check if request validation is required
            var shouldPerformRequestValidation = controllerContext.Controller.ValidateRequest && bindingContext.ModelMetadata.RequestValidationEnabled;

            var incomingData = bindingContext.GetValueFromValueProvider(shouldPerformRequestValidation).AttemptedValue;

            var document = XDocument.Parse(incomingData);

            return(document);
        }
 public object BindModel(ControllerContext controllerContext, ModelBindingContext bindingContext)
 {
     try
     {
         var value = bindingContext.GetValueFromValueProvider();
         bindingContext.ModelState.SetModelValue(bindingContext.ModelName, value);
         var rawValue = (value == null ? null : value.RawValue as string[]) ?? new string[] { };
         return(_implicitConversionMethod.Invoke(null, new object[] { rawValue.SingleOrDefault() }));
     }
     catch (TargetInvocationException ex)
     {
         bindingContext.ModelState.AddModelError(bindingContext.ModelName, ex.InnerException);
         return(null);
     }
 }
예제 #4
0
 public override object BindModel(ControllerContext controllerContext, ModelBindingContext bindingContext)
 {
     try
     {
         var result = base.BindModel(controllerContext, bindingContext);
         return(result);
     }
     catch (HttpRequestValidationException)
     {
         var modelState = new ModelState();
         modelState.Errors.Add(string.Format("'{0}' contains invalid characters", bindingContext.ModelMetadata.DisplayName ?? bindingContext.ModelMetadata.PropertyName));
         modelState.Value = bindingContext.GetValueFromValueProvider(false);
         bindingContext.ModelState.Add(bindingContext.ModelName, modelState);
     }
     return(null);
 }
예제 #5
0
        public object BindModel(ControllerContext controllerContext, ModelBindingContext bindingContext)
        {
            // Obey ValidateInput decorator used in Controller actions.
            // Attribution: http://blogs.taiga.nl/martijn/2011/09/29/custom-model-binders-and-request-validation/
            bool shouldPerformRequestValidation = controllerContext.Controller.ValidateRequest && bindingContext.ModelMetadata.RequestValidationEnabled;
            var  valueResult = bindingContext.GetValueFromValueProvider(shouldPerformRequestValidation);

            //ValueProviderResult valueResult = bindingContext.ValueProvider.GetValue(bindingContext.ModelName);
            if (valueResult == null || string.IsNullOrEmpty(valueResult.AttemptedValue))
            {
                return(null);
            }

            // Perform trim.
            string value = valueResult.AttemptedValue.Trim();

            // Check for single comma value - some old browser version does this, couldn't figure out which.
            if (string.Equals(value, ","))
            {
                return(null);
            }

            return(value);
        }