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

Jos*_* M. 34 iis-7.5 unobtrusive-validation asp.net-mvc-3

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

这是指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; }
}
Run Code Online (Sandbox Code Playgroud)

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

我确实添加了对DataAnnotationExtensions(http://dataannotationsextensions.org)的引用,是否会导致问题?

编辑:删除引用没有解决问题.似乎有些东西可能搞砸了IIS配置?

Ken*_*itt 20

JimmiTh对这个问题的评论为我提供了一个重要的见解,让我自己解决这个问题.

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

ModelValidatorProviders.Providers.Add(
    new FluentValidationModelValidatorProvider(validatorFactory));
Run Code Online (Sandbox Code Playgroud)

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

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

FluentValidationModelValidatorProvider.Configure();
Run Code Online (Sandbox Code Playgroud)

Configure上面的方法本身就是添加了一个提供程序ModelValidatorProviders,我实际上两次注册了同一个验证器类,因此出现了关于非唯一"验证类型名称"的错误.

SO问题jquery - 流利的验证.错误:不显眼的客户端验证规则中的验证类型名称必须是另一种使用多个提供程序可能导致上述问题的方式的唯一点.可以将每个提供程序配置为向"值类型"添加"隐式必需属性"(即,不可为空的视图模型属性).要解决此特定问题,我可以将代码更改为以下内容,以便所有提供程序都不添加隐式必需属性:

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; 
Run Code Online (Sandbox Code Playgroud)


Pma*_*Ace 13

我的情况是我的

.NotEmpty()
Run Code Online (Sandbox Code Playgroud)

.NotNull()
Run Code Online (Sandbox Code Playgroud)

同时,只需要一个.


Vey*_*mir 5

如果您同时使用 FluentValidation 和 DataAnnotations,这可能会发生。

当 FluentValidation 起作用时,您可能需要从 Application_Start 方法中注册的 ModelValidatorProviders 中删除 DataAnnotationsModelValidatorProvider。

FluentValidationModelValidatorProvider.Configure(); 
// Remove data annotations validation provider 
ModelValidatorProviders.Providers.Remove(
            ModelValidatorProviders.Providers.OfType<DataAnnotationsModelValidatorProvider>().First());
Run Code Online (Sandbox Code Playgroud)


jai*_*444 0

请更新 web.config 文件:

<configuration>
    <appSettings>
        <add key="ClientValidationEnabled" value="true"/>
        <add key="UnobtrusiveJavaScriptEnabled" value="true"/>
    </appSettings>
</configuration>
Run Code Online (Sandbox Code Playgroud)