public void CreateBindingMetadata(BindingMetadataProviderContext context) { if (context == null) { throw new ArgumentNullException(nameof(context)); } // BinderModelName foreach (var binderModelNameAttribute in context.Attributes.OfType <IModelNameProvider>()) { if (binderModelNameAttribute?.Name != null) { context.BindingMetadata.BinderModelName = binderModelNameAttribute.Name; break; } } // BinderType foreach (var binderTypeAttribute in context.Attributes.OfType <IBinderTypeProviderMetadata>()) { if (binderTypeAttribute.BinderType != null) { context.BindingMetadata.BinderType = binderTypeAttribute.BinderType; break; } } // BindingSource foreach (var bindingSourceAttribute in context.Attributes.OfType <IBindingSourceMetadata>()) { if (bindingSourceAttribute.BindingSource != null) { context.BindingMetadata.BindingSource = bindingSourceAttribute.BindingSource; break; } } // PropertyFilterProvider var propertyFilterProviders = context.Attributes.OfType <IPropertyFilterProvider>().ToArray(); if (propertyFilterProviders.Length == 0) { context.BindingMetadata.PropertyFilterProvider = null; } else if (propertyFilterProviders.Length == 1) { context.BindingMetadata.PropertyFilterProvider = propertyFilterProviders[0]; } else { var composite = new CompositePropertyFilterProvider(propertyFilterProviders); context.BindingMetadata.PropertyFilterProvider = composite; } var bindingBehavior = FindBindingBehavior(context); if (bindingBehavior != null) { context.BindingMetadata.IsBindingAllowed = bindingBehavior.Behavior != BindingBehavior.Never; context.BindingMetadata.IsBindingRequired = bindingBehavior.Behavior == BindingBehavior.Required; } if (GetBoundConstructor(context.Key.ModelType) is ConstructorInfo constructorInfo) { context.BindingMetadata.BoundConstructor = constructorInfo; } }
public void CreateBindingMetadata(BindingMetadataProviderContext context) { if (context == null) { throw new ArgumentNullException(nameof(context)); } // BinderModelName foreach (var binderModelNameAttribute in context.Attributes.OfType <IModelNameProvider>()) { if (binderModelNameAttribute?.Name != null) { context.BindingMetadata.BinderModelName = binderModelNameAttribute.Name; break; } } // BinderType foreach (var binderTypeAttribute in context.Attributes.OfType <IBinderTypeProviderMetadata>()) { if (binderTypeAttribute.BinderType != null) { context.BindingMetadata.BinderType = binderTypeAttribute.BinderType; break; } } // BindingSource foreach (var bindingSourceAttribute in context.Attributes.OfType <IBindingSourceMetadata>()) { if (bindingSourceAttribute.BindingSource != null) { context.BindingMetadata.BindingSource = bindingSourceAttribute.BindingSource; break; } } // PropertyFilterProvider var propertyFilterProviders = context.Attributes.OfType <IPropertyFilterProvider>().ToArray(); if (propertyFilterProviders.Length == 0) { context.BindingMetadata.PropertyFilterProvider = null; } else if (propertyFilterProviders.Length == 1) { context.BindingMetadata.PropertyFilterProvider = propertyFilterProviders[0]; } else { var composite = new CompositePropertyFilterProvider(propertyFilterProviders); context.BindingMetadata.PropertyFilterProvider = composite; } if (context.Key.MetadataKind == ModelMetadataKind.Property) { // BindingBehavior can fall back to attributes on the Container Type, but we should ignore // attributes on the Property Type. var bindingBehavior = context.PropertyAttributes.OfType <BindingBehaviorAttribute>().FirstOrDefault(); if (bindingBehavior == null) { bindingBehavior = context.Key.ContainerType.GetTypeInfo() .GetCustomAttributes(typeof(BindingBehaviorAttribute), inherit: true) .OfType <BindingBehaviorAttribute>() .FirstOrDefault(); } if (bindingBehavior != null) { context.BindingMetadata.IsBindingAllowed = bindingBehavior.Behavior != BindingBehavior.Never; context.BindingMetadata.IsBindingRequired = bindingBehavior.Behavior == BindingBehavior.Required; } } }
/// <inheritdoc /> public void CreateBindingMetadata(BindingMetadataProviderContext context) { if (context == null) { throw new ArgumentNullException(nameof(context)); } // BinderModelName foreach (var binderModelNameAttribute in context.Attributes.OfType<IModelNameProvider>()) { if (binderModelNameAttribute?.Name != null) { context.BindingMetadata.BinderModelName = binderModelNameAttribute.Name; break; } } // BinderType foreach (var binderTypeAttribute in context.Attributes.OfType<IBinderTypeProviderMetadata>()) { if (binderTypeAttribute.BinderType != null) { context.BindingMetadata.BinderType = binderTypeAttribute.BinderType; break; } } // BindingSource foreach (var bindingSourceAttribute in context.Attributes.OfType<IBindingSourceMetadata>()) { if (bindingSourceAttribute.BindingSource != null) { context.BindingMetadata.BindingSource = bindingSourceAttribute.BindingSource; break; } } // ModelBindingMessageProvider // Provide a unique instance based on one passed to the constructor. context.BindingMetadata.ModelBindingMessageProvider = new ModelBindingMessageProvider(_messageProvider); // PropertyFilterProvider var propertyFilterProviders = context.Attributes.OfType<IPropertyFilterProvider>().ToArray(); if (propertyFilterProviders.Length == 0) { context.BindingMetadata.PropertyFilterProvider = null; } else if (propertyFilterProviders.Length == 1) { context.BindingMetadata.PropertyFilterProvider = propertyFilterProviders[0]; } else { var composite = new CompositePropertyFilterProvider(propertyFilterProviders); context.BindingMetadata.PropertyFilterProvider = composite; } if (context.Key.MetadataKind == ModelMetadataKind.Property) { // BindingBehavior can fall back to attributes on the Container Type, but we should ignore // attributes on the Property Type. var bindingBehavior = context.PropertyAttributes.OfType<BindingBehaviorAttribute>().FirstOrDefault(); if (bindingBehavior == null) { bindingBehavior = context.Key.ContainerType.GetTypeInfo() .GetCustomAttributes(typeof(BindingBehaviorAttribute), inherit: true) .OfType<BindingBehaviorAttribute>() .FirstOrDefault(); } if (bindingBehavior != null) { context.BindingMetadata.IsBindingAllowed = bindingBehavior.Behavior != BindingBehavior.Never; context.BindingMetadata.IsBindingRequired = bindingBehavior.Behavior == BindingBehavior.Required; } } }