public CollectionIndexModelBinder(IIndexModelBinder elementBinder) { if (elementBinder == null) { throw new ArgumentNullException(nameof(elementBinder)); } ElementBinder = elementBinder; }
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)); }
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); }
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); }
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); }