public void GetBindingMetadata(BindingMetadataProviderContext context) { if (context == null) { throw new ArgumentNullException(nameof(context)); } // Don't bother with ModelBindingMessageProvider copy constructor. No other provider can change the // delegates. context.BindingMetadata.ModelBindingMessageProvider = _messageProvider; }
/// <inheritdoc /> public virtual void GetBindingMetadata(BindingMetadataProviderContext context) { if (context == null) { throw new ArgumentNullException(nameof(context)); } foreach (var provider in _providers.OfType<IBindingMetadataProvider>()) { provider.GetBindingMetadata(context); } }
/// <inheritdoc /> public void GetBindingMetadata(BindingMetadataProviderContext context) { if (context == null) { throw new ArgumentNullException(nameof(context)); } var editableAttribute = context.Attributes.OfType<EditableAttribute>().FirstOrDefault(); if (editableAttribute != null) { context.BindingMetadata.IsReadOnly = !editableAttribute.AllowEdit; } }
/// <inheritdoc /> public void GetBindingMetadata([NotNull] BindingMetadataProviderContext 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; } } // PropertyBindingPredicateProvider var predicateProviders = context.Attributes.OfType <IPropertyBindingPredicateProvider>().ToArray(); if (predicateProviders.Length > 0) { context.BindingMetadata.PropertyBindingPredicateProvider = new CompositePredicateProvider( predicateProviders); } }
public void GetBindingDetails_OverrideBehaviorOnClass_OverrideWithNever() { // Arrange var propertyAttributes = new object[] { new BindNeverAttribute(), }; var context = new BindingMetadataProviderContext( ModelMetadataIdentity.ForProperty(typeof(string), "Property", typeof(BindRequiredOnClass)), new ModelAttributes(propertyAttributes, typeAttributes: new object[0])); var provider = new DefaultBindingMetadataProvider(); // Act provider.GetBindingMetadata(context); // Assert Assert.False(context.BindingMetadata.IsBindingAllowed); Assert.False(context.BindingMetadata.IsBindingRequired); }
public void GetBindingDetails_FindsBindRequired_OnProperty() { // Arrange var propertyAttributes = new object[] { new BindRequiredAttribute(), }; var context = new BindingMetadataProviderContext( ModelMetadataIdentity.ForProperty(typeof(int), "Length", typeof(string)), new ModelAttributes(propertyAttributes, typeAttributes: new object[0])); var provider = new DefaultBindingMetadataProvider(); // Act provider.GetBindingMetadata(context); // Assert Assert.True(context.BindingMetadata.IsBindingAllowed); Assert.True(context.BindingMetadata.IsBindingRequired); }
public void GetBindingDetails_FindsBinderTypeProvider() { // Arrange var attributes = new object[] { new ModelBinderAttribute() { BinderType = typeof(HeaderModelBinder) }, new ModelBinderAttribute() { BinderType = typeof(ArrayModelBinder<string>) }, }; var context = new BindingMetadataProviderContext( ModelMetadataIdentity.ForType(typeof(string)), new ModelAttributes(attributes)); var provider = new DefaultBindingMetadataProvider(); // Act provider.GetBindingMetadata(context); // Assert Assert.Equal(typeof(HeaderModelBinder), context.BindingMetadata.BinderType); }
public void GetBindingDetails_FindsBindingSource() { // Arrange var attributes = new object[] { new BindingSourceModelBinderAttribute(BindingSource.Body), new BindingSourceModelBinderAttribute(BindingSource.Query), }; var context = new BindingMetadataProviderContext( ModelMetadataIdentity.ForType(typeof(string)), new ModelAttributes(attributes)); var provider = new DefaultBindingMetadataProvider(CreateMessageProvider()); // Act provider.GetBindingMetadata(context); // Assert Assert.Equal(BindingSource.Body, context.BindingMetadata.BindingSource); }
public void GetBindingDetails_FindsModelName() { // Arrange var attributes = new object[] { new ModelBinderAttribute() { Name = "Product" }, new ModelBinderAttribute() { Name = "Order" }, }; var context = new BindingMetadataProviderContext( ModelMetadataIdentity.ForType(typeof(string)), new ModelAttributes(attributes)); var provider = new DefaultBindingMetadataProvider(); // Act provider.GetBindingMetadata(context); // Assert Assert.Equal("Product", context.BindingMetadata.BinderModelName); }
public void IsBindingRequired_LeftAlone_ForNonPropertyMetadata(bool initialValue) { // Arrange var provider = new DataMemberRequiredBindingMetadataProvider(); var attributes = new object[] { new DataMemberAttribute() { IsRequired = true, } }; var key = ModelMetadataIdentity.ForType(typeof(ClassWithDataMemberIsRequiredTrue)); var context = new BindingMetadataProviderContext(key, new ModelAttributes(attributes, new object[0])); context.BindingMetadata.IsBindingRequired = initialValue; // Act provider.GetBindingMetadata(context); // Assert Assert.Equal(initialValue, context.BindingMetadata.IsBindingRequired); }
/// <inheritdoc /> public void GetBindingMetadata(BindingMetadataProviderContext context) { if (context == null) { throw new ArgumentNullException(nameof(context)); } // Types cannot be required; only properties can if (context.Key.MetadataKind != ModelMetadataKind.Property) { return; } if (context.BindingMetadata.IsBindingRequired) { // This value is already required, no need to look at attributes. return; } var dataMemberAttribute = context .PropertyAttributes .OfType <DataMemberAttribute>() .FirstOrDefault(); if (dataMemberAttribute == null || !dataMemberAttribute.IsRequired) { return; } // isDataContract == true iff the container type has at least one DataContractAttribute var containerType = context.Key.ContainerType.GetTypeInfo(); var isDataContract = containerType.IsDefined(typeof(DataContractAttribute)); if (isDataContract) { // We don't need to add a validator, just to set IsRequired = true. The validation // system will do the right thing. context.BindingMetadata.IsBindingRequired = true; } }
public void GetBindingDetails_UsesFirstAttribute() { // Arrange var propertyAttributes = new object[] { new BindingBehaviorAttribute(BindingBehavior.Required), new BindNeverAttribute(), }; var context = new BindingMetadataProviderContext( ModelMetadataIdentity.ForProperty(typeof(int), "Length", typeof(string)), new ModelAttributes(propertyAttributes, typeAttributes: new object[0])); var provider = new DefaultBindingMetadataProvider(CreateMessageProvider()); // Act provider.GetBindingMetadata(context); // Assert Assert.True(context.BindingMetadata.IsBindingAllowed); Assert.True(context.BindingMetadata.IsBindingRequired); }
public void IsBindingRequired_SetToTrue_WithDataMemberIsRequiredTrue() { // Arrange var provider = new DataMemberRequiredBindingMetadataProvider(); var attributes = new object[] { new DataMemberAttribute() { IsRequired = true, } }; var key = ModelMetadataIdentity.ForProperty( typeof(string), nameof(ClassWithDataMemberIsRequiredTrue.StringProperty), typeof(ClassWithDataMemberIsRequiredTrue)); var context = new BindingMetadataProviderContext(key, new ModelAttributes(attributes, new object[0])); // Act provider.GetBindingMetadata(context); // Assert Assert.True(context.BindingMetadata.IsBindingRequired); }
/// <inheritdoc /> public void GetBindingMetadata(BindingMetadataProviderContext context) { if (context == null) { throw new ArgumentNullException(nameof(context)); } // Types cannot be required; only properties can if (context.Key.MetadataKind != ModelMetadataKind.Property) { return; } if (context.BindingMetadata.IsBindingRequired) { // This value is already required, no need to look at attributes. return; } var dataMemberAttribute = context .PropertyAttributes .OfType<DataMemberAttribute>() .FirstOrDefault(); if (dataMemberAttribute == null || !dataMemberAttribute.IsRequired) { return; } // isDataContract == true iff the container type has at least one DataContractAttribute var containerType = context.Key.ContainerType.GetTypeInfo(); var isDataContract = containerType.GetCustomAttribute<DataContractAttribute>() != null; if (isDataContract) { // We don't need to add a validator, just to set IsRequired = true. The validation // system will do the right thing. context.BindingMetadata.IsBindingRequired = true; } }
public void IsRequired_LeftAlone_DataMemberIsRequiredFalse(bool? initialValue) { // Arrange var provider = new DataMemberRequiredBindingMetadataProvider(); var attributes = new object[] { new DataMemberAttribute() { IsRequired = false, } }; var key = ModelMetadataIdentity.ForProperty( typeof(string), nameof(ClassWithDataMemberIsRequiredFalse.StringProperty), typeof(ClassWithDataMemberIsRequiredFalse)); var context = new BindingMetadataProviderContext(key, attributes); context.BindingMetadata.IsRequired = initialValue; // Act provider.GetBindingMetadata(context); // Assert Assert.Equal(initialValue, context.BindingMetadata.IsRequired); }
public void IsRequired_LeftAlone_ForNonPropertyMetadata(bool?initialValue) { // Arrange var provider = new DataMemberRequiredBindingMetadataProvider(); var attributes = new object[] { new DataMemberAttribute() { IsRequired = true, } }; var key = ModelMetadataIdentity.ForType(typeof(ClassWithDataMemberIsRequiredTrue)); var context = new BindingMetadataProviderContext(key, attributes); context.BindingMetadata.IsRequired = initialValue; // Act provider.GetBindingMetadata(context); // Assert Assert.Equal(initialValue, context.BindingMetadata.IsRequired); }
public void GetBindingMetadata_EditableAttributeTrue_SetsReadOnlyFalse() { // Arrange var provider = new DataAnnotationsMetadataProvider(); var editable = new EditableAttribute(allowEdit: true); var attributes = new Attribute[] { editable }; var key = ModelMetadataIdentity.ForType(typeof(string)); var context = new BindingMetadataProviderContext(key, new ModelAttributes(attributes)); // Act provider.GetBindingMetadata(context); // Assert Assert.False(context.BindingMetadata.IsReadOnly); }
public void GetBindingDetails_BindingBehaviorLeftAlone_ForAttributeOnPropertyType(bool initialValue) { // Arrange var typeAttributes = new object[] { new BindingBehaviorAttribute(BindingBehavior.Required), }; var context = new BindingMetadataProviderContext( ModelMetadataIdentity.ForProperty(typeof(int), "Length", typeof(string)), new ModelAttributes(propertyAttributes: new object[0], typeAttributes: typeAttributes)); // These values shouldn't be changed since this is a Type-Metadata context.BindingMetadata.IsBindingAllowed = initialValue; context.BindingMetadata.IsBindingRequired = initialValue; var provider = new DefaultBindingMetadataProvider(); // Act provider.GetBindingMetadata(context); // Assert Assert.Equal(initialValue, context.BindingMetadata.IsBindingAllowed); Assert.Equal(initialValue, context.BindingMetadata.IsBindingRequired); }
public void GetBindingMetadata(BindingMetadataProviderContext context) { // Don't bother with ModelBindingMessageProvider copy constructor. No other provider can change the // delegates. context.BindingMetadata.ModelBindingMessageProvider = _messageProvider; }
public void GetBindingDetails_OverrideBehaviorOnClass_OverrideWithOptional() { // Arrange var propertyAttributes = new object[] { new BindingBehaviorAttribute(BindingBehavior.Optional) }; var context = new BindingMetadataProviderContext( ModelMetadataIdentity.ForProperty(typeof(string), "Property", typeof(BindNeverOnClass)), new ModelAttributes(propertyAttributes, typeAttributes: new object[0])); var provider = new DefaultBindingMetadataProvider(); // Act provider.GetBindingMetadata(context); // Assert Assert.True(context.BindingMetadata.IsBindingAllowed); Assert.False(context.BindingMetadata.IsBindingRequired); }
public void GetBindingDetails_OverrideBehaviorOnBaseClass_OverrideWithRequired_OnClass() { // Arrange var context = new BindingMetadataProviderContext( ModelMetadataIdentity.ForProperty(typeof(string), "Property", typeof(BindRequiredOverridesInheritedBindNever)), new ModelAttributes(propertyAttributes: new object[0], typeAttributes: new object[0])); var provider = new DefaultBindingMetadataProvider(); // Act provider.GetBindingMetadata(context); // Assert Assert.True(context.BindingMetadata.IsBindingAllowed); Assert.True(context.BindingMetadata.IsBindingRequired); }
public void GetBindingDetails_UsesFirstAttribute() { // Arrange var propertyAttributes = new object[] { new BindingBehaviorAttribute(BindingBehavior.Required), new BindNeverAttribute(), }; var context = new BindingMetadataProviderContext( ModelMetadataIdentity.ForProperty(typeof(int), "Length", typeof(string)), new ModelAttributes(propertyAttributes, typeAttributes: new object[0])); var provider = new DefaultBindingMetadataProvider(); // Act provider.GetBindingMetadata(context); // Assert Assert.True(context.BindingMetadata.IsBindingAllowed); Assert.True(context.BindingMetadata.IsBindingRequired); }
public void GetBindingDetails_FindsBindNever_OnContainerClass() { // Arrange var context = new BindingMetadataProviderContext( ModelMetadataIdentity.ForProperty(typeof(string), "Property", typeof(BindNeverOnClass)), new ModelAttributes(propertyAttributes: new object[0], typeAttributes: new object[0])); var provider = new DefaultBindingMetadataProvider(); // Act provider.GetBindingMetadata(context); // Assert Assert.False(context.BindingMetadata.IsBindingAllowed); Assert.False(context.BindingMetadata.IsBindingRequired); }
public void GetBindingDetails_FindsBindRequired_OnProperty() { // Arrange var propertyAttributes = new object[] { new BindRequiredAttribute(), }; var context = new BindingMetadataProviderContext( ModelMetadataIdentity.ForProperty(typeof(int), "Length", typeof(string)), new ModelAttributes(propertyAttributes, typeAttributes: new object[0])); var provider = new DefaultBindingMetadataProvider(CreateMessageProvider()); // Act provider.GetBindingMetadata(context); // Assert Assert.True(context.BindingMetadata.IsBindingAllowed); Assert.True(context.BindingMetadata.IsBindingRequired); }
public void GetBindingDetails_FindsBindingSource_IfNullFallsBack() { // Arrange var attributes = new object[] { new ModelBinderAttribute(), new ModelBinderAttribute() { BindingSource = BindingSource.Body }, new ModelBinderAttribute() { BindingSource = BindingSource.Query }, }; var context = new BindingMetadataProviderContext( ModelMetadataIdentity.ForType(typeof(string)), new ModelAttributes(attributes)); var provider = new DefaultBindingMetadataProvider(); // Act provider.GetBindingMetadata(context); // Assert Assert.Equal(BindingSource.Body, context.BindingMetadata.BindingSource); }
public void GetDisplayDetails_RequiredAttribute_SetsRequired() { // Arrange var provider = new DataAnnotationsMetadataProvider(); var required = new RequiredAttribute(); var attributes = new Attribute[] { required }; var key = ModelMetadataIdentity.ForType(typeof(string)); var context = new BindingMetadataProviderContext(key, attributes); // Act provider.GetBindingMetadata(context); // Assert Assert.Equal(true, context.BindingMetadata.IsRequired); }
/// <inheritdoc /> public void GetBindingMetadata([NotNull] BindingMetadataProviderContext 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); // PropertyBindingPredicateProvider var predicateProviders = context.Attributes.OfType <IPropertyBindingPredicateProvider>().ToArray(); if (predicateProviders.Length > 0) { context.BindingMetadata.PropertyBindingPredicateProvider = new CompositePredicateProvider( predicateProviders); } 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; } } }
public void GetBindingDetails_NoEditableAttribute_IsReadOnlyLeftAlone(bool? initialValue) { // Arrange var provider = new DataAnnotationsMetadataProvider(); var attributes = new Attribute[] { }; var key = ModelMetadataIdentity.ForProperty(typeof(int), "Length", typeof(string)); var context = new BindingMetadataProviderContext(key, new ModelAttributes(attributes, new object[0])); context.BindingMetadata.IsReadOnly = initialValue; // Act provider.GetBindingMetadata(context); // Assert Assert.Equal(initialValue, context.BindingMetadata.IsReadOnly); }
public void GetBindingMetadata_RequiredAttribute_IsBindingRequiredLeftAlone(bool initialValue) { // Arrange var provider = new DataAnnotationsMetadataProvider(); var attributes = new Attribute[] { new RequiredAttribute() }; var key = ModelMetadataIdentity.ForProperty(typeof(int), "Length", typeof(string)); var context = new BindingMetadataProviderContext(key, new ModelAttributes(attributes, new object[0])); context.BindingMetadata.IsBindingRequired = initialValue; // Act provider.GetBindingMetadata(context); // Assert Assert.Equal(initialValue, context.BindingMetadata.IsBindingRequired); }
public void GetBindingDetails_RequiredAttribute_SetsIsRequiredToTrue() { // Arrange var provider = new DataAnnotationsMetadataProvider(); var required = new RequiredAttribute(); var attributes = new Attribute[] { required }; var key = ModelMetadataIdentity.ForProperty(typeof(int), "Length", typeof(string)); var context = new BindingMetadataProviderContext(key, attributes); // Act provider.GetBindingMetadata(context); // Assert Assert.True(context.BindingMetadata.IsRequired); }
public void IsBindingRequired_LeftAlone_WithoutDataMemberAttribute(bool initialValue) { // Arrange var provider = new DataMemberRequiredBindingMetadataProvider(); var key = ModelMetadataIdentity.ForProperty( typeof(string), nameof(ClassWithoutAttributes.StringProperty), typeof(ClassWithoutAttributes)); var context = new BindingMetadataProviderContext(key, new ModelAttributes(new object[0], new object[0])); context.BindingMetadata.IsBindingRequired = initialValue; // Act provider.GetBindingMetadata(context); // Assert Assert.Equal(initialValue, context.BindingMetadata.IsBindingRequired); }
/// <inheritdoc /> public void GetBindingMetadata(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); // PropertyBindingPredicateProvider var predicateProviders = context.Attributes.OfType<IPropertyBindingPredicateProvider>().ToArray(); if (predicateProviders.Length > 0) { context.BindingMetadata.PropertyBindingPredicateProvider = new CompositePredicateProvider( predicateProviders); } 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; } } }