public void ClassWithoutAttributes_NoValidator() { // Arrange var provider = new DataMemberModelValidatorProvider(); var metadata = _metadataProvider.GetMetadataForProperty(() => null, typeof(ClassWithoutAttributes), "TheProperty"); // Act var validators = provider.GetValidators(metadata); // Assert Assert.Empty(validators); }
public void ClassWithDataMemberIsRequiredTrueWithoutDataContract_NoValidator() { // Arrange var provider = new DataMemberModelValidatorProvider(); var metadata = _metadataProvider.GetMetadataForProperty(() => null, typeof(ClassWithDataMemberIsRequiredTrueWithoutDataContract), "TheProperty"); // Act var validators = provider.GetValidators(metadata); // Assert Assert.Empty(validators); }
public void ClassWithDataMemberIsRequiredTrue_Validator() { // Arrange var provider = new DataMemberModelValidatorProvider(); var metadata = _metadataProvider.GetMetadataForProperty(() => null, typeof(ClassWithDataMemberIsRequiredTrue), "TheProperty"); // Act var validators = provider.GetValidators(metadata); // Assert var validator = Assert.Single(validators); Assert.True(validator.IsRequired); }
protected override IEnumerable <IModelValidator> GetValidators(ModelMetadata metadata, IEnumerable <Attribute> attributes) { if (metadata.ContainerType == null || string.IsNullOrEmpty(metadata.PropertyName)) { // Validate that the type's fields and nonpublic properties don't have any validation attributes on // them. Validation only runs against public properties var type = metadata.ModelType; var nonPublicProperties = type.GetProperties(BindingFlags.NonPublic | BindingFlags.Instance); foreach (var nonPublicProperty in nonPublicProperties) { if (nonPublicProperty.GetCustomAttributes(typeof(ValidationAttribute), inherit: true).Any()) { var message = Resources.FormatValidationAttributeOnNonPublicProperty(nonPublicProperty.Name, type); yield return(new ErrorModelValidator(message)); } } var bindingFlags = BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance; var allFields = metadata.ModelType.GetFields(bindingFlags); foreach (var field in allFields) { if (field.GetCustomAttributes(typeof(ValidationAttribute), inherit: true).Any()) { var message = Resources.FormatValidationAttributeOnField(field.Name, type); yield return(new ErrorModelValidator(message)); } } } else { // Validate that value-typed properties marked as [Required] are also marked as // [DataMember(IsRequired=true)]. Certain formatters may not recognize a member as required if it's // marked as [Required] but not [DataMember(IsRequired=true)]. This is not a problem for reference // types because [Required] will still cause a model error to be raised after a null value is // deserialized. if (metadata.ModelType.GetTypeInfo().IsValueType&& attributes.Any(attribute => attribute is RequiredAttribute)) { if (!DataMemberModelValidatorProvider.IsRequiredDataMember(metadata.ContainerType, attributes)) { var message = Resources.FormatMissingDataMemberIsRequired(metadata.PropertyName, metadata.ContainerType); yield return(new ErrorModelValidator(message)); } } } }