public CollectionIndexModelBinder(IIndexModelBinder elementBinder)
        {
            if (elementBinder == null)
            {
                throw new ArgumentNullException(nameof(elementBinder));
            }

            ElementBinder = elementBinder;
        }
예제 #2
0
        private bool TryGetCachedBinder(ModelMetadata metadata, object cacheToken, out IIndexModelBinder binder)
        {
            Debug.Assert(metadata != null);

            if (cacheToken == null)
            {
                binder = null;
                return(false);
            }

            return(_cache.TryGetValue(new Key(metadata, cacheToken), out binder));
        }
예제 #3
0
        private void AddToCache(ModelMetadata metadata, object cacheToken, IIndexModelBinder binder)
        {
            Debug.Assert(metadata != null);
            Debug.Assert(binder != null);

            if (cacheToken == null)
            {
                return;
            }

            _cache.TryAdd(new Key(metadata, cacheToken), binder);
        }
예제 #4
0
        private IIndexModelBinder CreateBinderCoreUncached(DefaultModelBinderProviderContext providerContext, object token)
        {
            if (!providerContext.Metadata.IsBindingAllowed)
            {
                return(IndexNoOpBinder.Instance);
            }

            var key = new Key(providerContext.Metadata, token);

            var visited = providerContext.Visited;

            IIndexModelBinder binder;

            if (visited.TryGetValue(key, out binder))
            {
                if (binder != null)
                {
                    return(binder);
                }

                binder       = new IndexPlaceholderBinder();
                visited[key] = binder;
                return(binder);
            }

            visited.Add(key, null);

            IIndexModelBinder result = null;

            for (var i = 0; i < _providers.Length; i++)
            {
                var provider = _providers[i];
                result = provider.GetBinder(providerContext);
                if (result != null)
                {
                    break;
                }
            }

            var placeholderBinder = visited[key] as IndexPlaceholderBinder;

            if (placeholderBinder != null)
            {
                placeholderBinder.Inner = result ?? IndexNoOpBinder.Instance;
            }

            if (result != null)
            {
                visited[key] = result;
            }

            return(result);
        }
        public static IIndexModelBinder GetIndexModelBinder(this PropertyInfo propInfo)
        {
            IIndexModelBinder result = null;
            var bindAttr             = propInfo.GetCustomAttributes <BindIndexFieldAttribute>().FirstOrDefault();

            if (bindAttr != null)
            {
                result = GetBinder(bindAttr);
            }
            if (result != null)
            {
                result.BindingInfo = propInfo.GetBindingInfo() ?? result.BindingInfo;
            }
            return(result);
        }
        public static IIndexModelBinder GetIndexModelBinder(this Type type, IIndexModelBinder defaultBinder)
        {
            var result   = defaultBinder;
            var bindAttr = type.GetCustomAttributes <BindIndexFieldAttribute>().FirstOrDefault();

            if (bindAttr != null)
            {
                result = GetBinder(bindAttr);
            }
            if (result != null)
            {
                result.BindingInfo = type.GetBindingInfo() ?? result.BindingInfo;
            }
            return(result);
        }
예제 #7
0
        public virtual async Task <ModelBindingResult> BindModelAsync(
            IIndexModelBinder modelBinder,
            IValueProvider valueProvider,
            ModelStateDictionary modelState,
            ParameterDescriptor parameter,
            ModelMetadata metadata,
            object value)
        {
            if (modelBinder == null)
            {
                throw new ArgumentNullException(nameof(modelBinder));
            }

            if (valueProvider == null)
            {
                throw new ArgumentNullException(nameof(valueProvider));
            }

            if (parameter == null)
            {
                throw new ArgumentNullException(nameof(parameter));
            }

            if (metadata == null)
            {
                throw new ArgumentNullException(nameof(metadata));
            }

            var modelBindingContext = DefaultIndexModelBindingContext.CreateBindingContext(
                valueProvider,
                modelState,
                metadata,
                parameter.BindingInfo,
                parameter.Name);

            modelBindingContext.Model = value;

            var parameterModelName = parameter.BindingInfo?.BinderModelName ?? metadata.BinderModelName;

            if (parameterModelName != null)
            {
                modelBindingContext.ModelName = parameterModelName;
            }
            else if (modelBindingContext.ValueProvider.ContainsPrefix(parameter.Name))
            {
                modelBindingContext.ModelName = parameter.Name;
            }
            else
            {
                modelBindingContext.ModelName = string.Empty;
            }

            await modelBinder.BindModelAsync(modelBindingContext);

            var modelBindingResult = modelBindingContext.Result;

            if (modelBindingResult.IsModelSet)
            {
                _validator.Validate(
                    modelBindingContext.ModelState,
                    modelBindingContext.ValidationState,
                    modelBindingContext.ModelName,
                    modelBindingResult.Model);
            }

            return(modelBindingResult);
        }