public void CreateBindingMetadata(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 CreateBindingMetadata(BindingMetadataProviderContext context) { if (context == null) { throw new ArgumentNullException(nameof(context)); } foreach (var provider in _providers.OfType<IBindingMetadataProvider>()) { provider.CreateBindingMetadata(context); } }
/// <inheritdoc /> public void CreateBindingMetadata(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; } }
public void IsBindingAllowed_LeftAlone_WhenTypeDoesntMatch(bool initialValue) { // Arrange var provider = new ExcludeBindingMetadataProvider(typeof(string)); var key = ModelMetadataIdentity.ForProperty( typeof(int), nameof(Person.Age), typeof(Person)); var context = new BindingMetadataProviderContext(key, new ModelAttributes(new object[0], new object[0])); context.BindingMetadata.IsBindingAllowed = initialValue; // Act provider.CreateBindingMetadata(context); // Assert Assert.Equal(initialValue, context.BindingMetadata.IsBindingAllowed); }
public void IsBindingAllowed_IsFalse_WhenTypeMatches(bool initialValue) { // Arrange var provider = new ExcludeBindingMetadataProvider(typeof(int)); var key = ModelMetadataIdentity.ForProperty( typeof(Person).GetProperty(nameof(Person.Age)), typeof(int), typeof(Person)); var context = new BindingMetadataProviderContext(key, new ModelAttributes(new object[0], new object[0], null)); context.BindingMetadata.IsBindingAllowed = initialValue; // Act provider.CreateBindingMetadata(context); // Assert Assert.False(context.BindingMetadata.IsBindingAllowed); }
public void CreateBindingDetails_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(CreateMessageProvider()); // Act provider.CreateBindingMetadata(context); // Assert Assert.Equal(typeof(HeaderModelBinder), context.BindingMetadata.BinderType); }
public void CreateBindingDetails_OverrideBehaviorOnClass_OverrideWithNever() { // Arrange var propertyAttributes = new object[] { new BindNeverAttribute(), }; var context = new BindingMetadataProviderContext( ModelMetadataIdentity.ForProperty(typeof(BindRequiredOnClass).GetProperty(nameof(BindRequiredOnClass.Property)), typeof(int), typeof(BindRequiredOnClass)), new ModelAttributes(new object[0], propertyAttributes, null)); var provider = new DefaultBindingMetadataProvider(); // Act provider.CreateBindingMetadata(context); // Assert Assert.False(context.BindingMetadata.IsBindingAllowed); Assert.False(context.BindingMetadata.IsBindingRequired); }
private static BindingBehaviorAttribute FindBindingBehavior(BindingMetadataProviderContext context) { switch (context.Key.MetadataKind) { case ModelMetadataKind.Property: // BindingBehavior can fall back to attributes on the Container Type, but we should ignore // attributes on the Property Type. var matchingAttributes = context.PropertyAttributes.OfType <BindingBehaviorAttribute>(); return(matchingAttributes.FirstOrDefault() ?? context.Key.ContainerType.GetTypeInfo() .GetCustomAttributes(typeof(BindingBehaviorAttribute), inherit: true) .OfType <BindingBehaviorAttribute>() .FirstOrDefault()); case ModelMetadataKind.Parameter: return(context.ParameterAttributes.OfType <BindingBehaviorAttribute>().FirstOrDefault()); default: return(null); } }
public void CreateBindingDetails_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(CreateMessageProvider()); // Act provider.CreateBindingMetadata(context); // Assert Assert.Equal("Product", context.BindingMetadata.BinderModelName); }
public void CreateBindingDetails_FindsBindRequired_OnParameter() { // Arrange var parameterAttributes = new object[] { new BindRequiredAttribute(), }; var context = new BindingMetadataProviderContext( ModelMetadataIdentity.ForParameter(ParameterInfos.SampleParameterInfo), new ModelAttributes(Array.Empty <object>(), null, parameterAttributes)); var provider = new DefaultBindingMetadataProvider(); // Act provider.CreateBindingMetadata(context); // Assert Assert.True(context.BindingMetadata.IsBindingAllowed); Assert.True(context.BindingMetadata.IsBindingRequired); }
public void CreateBindingDetails_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, null, null)); var provider = new DefaultBindingMetadataProvider(); // Act provider.CreateBindingMetadata(context); // Assert Assert.Equal(BindingSource.Body, context.BindingMetadata.BindingSource); }
public void CreateBindingDetails_FindsBindRequired_OnProperty() { // Arrange var propertyAttributes = new object[] { new BindRequiredAttribute(), }; var context = new BindingMetadataProviderContext( ModelMetadataIdentity.ForProperty(typeof(string).GetProperty(nameof(string.Length)), typeof(int), typeof(string)), new ModelAttributes(new object[0], propertyAttributes, null)); var provider = new DefaultBindingMetadataProvider(); // Act provider.CreateBindingMetadata(context); // Assert Assert.True(context.BindingMetadata.IsBindingAllowed); Assert.True(context.BindingMetadata.IsBindingRequired); }
public void CreateBindingDetails_FindsBindingBehaviorNever_OnProperty() { // Arrange var propertyAttributes = new object[] { new BindingBehaviorAttribute(BindingBehavior.Never), }; var context = new BindingMetadataProviderContext( ModelMetadataIdentity.ForProperty(typeof(int), "Length", typeof(string)), new ModelAttributes(new object[0], propertyAttributes, null)); var provider = new DefaultBindingMetadataProvider(); // Act provider.CreateBindingMetadata(context); // Assert Assert.False(context.BindingMetadata.IsBindingAllowed); Assert.False(context.BindingMetadata.IsBindingRequired); }
public void CreateBindingDetails_OverrideInheritedBehaviorOnClass_OverrideWithRequired() { // Arrange var propertyAttributes = new object[] { new BindRequiredAttribute() }; var context = new BindingMetadataProviderContext( ModelMetadataIdentity.ForProperty(typeof(string), "Property", typeof(InheritedBindNeverOnClass)), new ModelAttributes(new object[0], propertyAttributes, null)); var provider = new DefaultBindingMetadataProvider(); // Act provider.CreateBindingMetadata(context); // Assert Assert.True(context.BindingMetadata.IsBindingAllowed); Assert.True(context.BindingMetadata.IsBindingRequired); }
/// <inheritdoc /> public void CreateBindingMetadata(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; 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; } }
/// <inheritdoc /> public void CreateBindingMetadata(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 CreateBindingDetails_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.CreateBindingMetadata(context); // Assert Assert.True(context.BindingMetadata.IsBindingAllowed); Assert.True(context.BindingMetadata.IsBindingRequired); }
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 CreateBindingDetails_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(CreateMessageProvider()); // Act provider.CreateBindingMetadata(context); // Assert Assert.False(context.BindingMetadata.IsBindingAllowed); Assert.False(context.BindingMetadata.IsBindingRequired); }
/// <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; } } }
public void CreateBindingDetails_FindsBindingSource_IfNullFallsBack() { // Arrange var attributes = new object[] { new ModelBinderAttribute(), 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.CreateBindingMetadata(context); // Assert Assert.Equal(BindingSource.Body, context.BindingMetadata.BindingSource); }
public void CreateBindingDetails_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(CreateMessageProvider()); // Act provider.CreateBindingMetadata(context); // Assert Assert.Equal(initialValue, context.BindingMetadata.IsBindingAllowed); Assert.Equal(initialValue, context.BindingMetadata.IsBindingRequired); }
public void CreateBindingDetails_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(CreateMessageProvider()); // Act provider.CreateBindingMetadata(context); // Assert Assert.True(context.BindingMetadata.IsBindingAllowed); Assert.True(context.BindingMetadata.IsBindingRequired); }
public void CreateBindingDetails_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(CreateMessageProvider()); // Act provider.CreateBindingMetadata(context); // Assert Assert.True(context.BindingMetadata.IsBindingAllowed); Assert.False(context.BindingMetadata.IsBindingRequired); }