15
votes

I got the erorr:

Validation type names in unobtrusive client validation rules must be unique. The following validation type was seen more than once: required. The following validation type was seen more than once: required

I used server validation. And all worked fine. But now I`m stating to use client-side validation and I got this problem.

This is my validation class code:

public class TestViewDataValidation : BaseTestCreateViewDataValidation<BaseTestCreateViewData>
    {

public TestViewDataValidation ()
        {
            this.RuleFor(x => x.Login).NotNull();
            this.RuleFor(x => x.Login).NotEmpty();
            this.RuleFor(x => x.Login).EmailAddress();          
        }
}

But if I leave one validator - all works fine. What should I do to have more that one validation for field.

2

2 Answers

28
votes

This error is shown if you have the same validation on the same element more than once.

Not setting AddImplicitRequiredAttributeForValueTypes = false for both the default DataAnnontations and your FluentValidation will add a Required validation on any ValueTypes (like an int). If you at the same time add a RuleFor (or a [Required] attribute) on any ValueType you will have an extra Required for that field.

For that reason (I want to set all validations explicitly) I have the following in my Application_Start():

var fluentValidationModelValidatorProvider = new FluentValidationModelValidatorProvider(new AttributedValidatorFactory());
ModelValidatorProviders.Providers.Add(fluentValidationModelValidatorProvider);
DataAnnotationsModelValidatorProvider.AddImplicitRequiredAttributeForValueTypes = false;
fluentValidationModelValidatorProvider.AddImplicitRequiredValidator = false;
17
votes

FluentValidation.NET is called Fluent because it provides a fluent interface for chaining methods:

public TestViewDataValidation()
{
    RuleFor(x => x.Login)
        .NotNull()
        .NotEmpty()
        .EmailAddress();
}

Remark: the usage of NotNull and NotEmpty rules seem reduntant to me in this case. NotEmpty should be enough.