不显眼的客户端验证规则中的验证类型名称必须是唯一的

时间:2012-03-17 00:34:47

标签: asp.net-mvc-3 iis-7.5 unobtrusive-validation

  

不显眼的客户端验证规则中的验证类型名称必须是   独特。以下验证类型不止一次出现:   需要

这是指EmailAddress属性,在这里:

public class LoginModel
{
    [Required]
    [DataType(DataType.EmailAddress)]
    [Display(Name = "Email")]
    [AdditionalMetadata("Style", "Wide")]
    public string EmailAddress { get; set; }

    [Required]
    [DataType(DataType.Password)]
    [Display(Name = "Password")]
    [AdditionalMetadata("Style", "Wide")]
    public string Password { get; set; }
}

我这里没有使用相同类型的验证规则两次。这在本地工作正常,但在部署到服务器时则不行。这是什么交易?

我添加了对DataAnnotationExtensionshttp://dataannotationsextensions.org)的引用,是否会导致问题?

编辑:删除引用并未解决问题。似乎有些事情可能与IIS配置搞混了?

5 个答案:

答案 0 :(得分:18)

关于这个问题的

JimmiTh's comment为我提供了一个重要的见解,让我自己解决这个问题。

就我而言,我确实在ModelValidatorProviders添加了一个额外的提供商。我在 Global.asax.cs 文件中添加了一个自定义验证工厂(使用Fluent Validation)和此代码:

ModelValidatorProviders.Providers.Add(
    new FluentValidationModelValidatorProvider(validatorFactory));

但使用多个提供商并非必然有问题。似乎有问题的是,如果多个提供者提供相同的验证器,因为这将多次注册相同的规则,导致提到的问题与Microsoft不显眼的验证代码。

我最终从同一个文件中删除了以下行,因为我决定不需要同时使用这两个提供程序:

FluentValidationModelValidatorProvider.Configure();

上面的Configure方法本身正在向ModelValidatorProviders添加一个提供程序,我实际上两次注册了同一个验证程序类,因此出现了关于非唯一“验证类型名称”的错误。

SO问题jquery - Fluent Validations. Error: Validation type names in unobtrusive client validation rules must be unique指出使用多个提供商的另一种方式可能导致上述问题。可以将每个提供程序配置为向“值类型”添加“隐式必需属性”(即,不可为空的视图模型属性)。要解决此特定问题,我可以将我的代码更改为以下内容,以便没有任何提供程序添加隐式必需属性:

FluentValidationModelValidatorProvider.Configure(
    provider => provider.AddImplicitRequiredValidator = false);


DependencyResolverValidatorFactory validatorFactory =
    new DependencyResolverValidatorFactory();

FluentValidationModelValidatorProvider validatorFactoryProvider =
    new FluentValidationModelValidatorProvider(validatorFactory);

validatorFactoryProvider.AddImplicitRequiredValidator = false;
ModelValidatorProviders.Providers.Add(validatorFactoryProvider);


DataAnnotationsModelValidatorProvider.AddImplicitRequiredAttributeForValueTypes = false; 

答案 1 :(得分:9)

我的情况是我有

.NotEmpty()

.NotNull()

同时,只需要一个。

答案 2 :(得分:2)

如果您与DataAnnotations并排使用FluentValidation,则可能会发生这种情况。

当FluentValidation处于运行状态时,您可能需要从Application_Start方法中注册的ModelValidatorProviders中删除DataAnnotationsModelValidatorProvider。

FluentValidationModelValidatorProvider.Configure(); 
// Remove data annotations validation provider 
ModelValidatorProviders.Providers.Remove(
            ModelValidatorProviders.Providers.OfType<DataAnnotationsModelValidatorProvider>().First());

答案 3 :(得分:0)

请更新web.config文件:

<configuration>
    <appSettings>
        <add key="ClientValidationEnabled" value="true"/>
        <add key="UnobtrusiveJavaScriptEnabled" value="true"/>
    </appSettings>
</configuration>

答案 4 :(得分:0)

在我的情况下,我同时将NotEmpty和Length条件添加到了验证规则中。

RuleFor(x => x.Code).NotEmpty().Length(1, 10);

当我删除NotEmpty条件时,错误消失了。