【问题标题】:Validation type names in unobtrusive client validation rules must be unique不显眼的客户端验证规则中的验证类型名称必须是唯一的
【发布时间】:2012-03-17 00:34:47
【问题描述】:

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

这里指的是 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; }
}

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

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

编辑:删除引用并不能解决问题。似乎 IIS 配置有问题?

【问题讨论】:

  • 我也在使用 dataannotationsextensions 并且没有任何问题。我看到的唯一区别是您使用了我从未使用过的“AdditionalMetadata”属性。尝试删除它,看看它是否仍然错误?
  • 我找到了这个链接,它可能会有所启发。 fluentvalidation.codeplex.com/workitem/7072
  • 从根 Web.config 中的 appSettings 中删除 <add key="ClientValidationEnabled" value="true"/><add key="UnobtrusiveJavaScriptEnabled" value="true"/> 解决了问题。
  • 我看到其他人说也解决了这个问题,但是这样做会丢失客户端验证。如果你可以没有它,那么这不是问题。但最好不必将模型发布到服务器只是为了运行模型验证并在失败时返回给客户端。
  • 迟到了(至少可以这么说),但是...在您的控制器中,您可以监视/跟踪ModelValidatorProviders.Providers 的内容吗? HTMLHelper(这是引发此错误的原因)只能通过咨询这些提供程序来获得不显眼的验证规则,如果 DataAnnotationExtensions 没有导致它(我们假设默认的 DataAnnotationModelValidatorProvider 也不是它自己导致的) ),其中应该有另一个提供程序,才会发生此错误。

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


【解决方案1】:

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; 

【讨论】:

    【解决方案2】:

    我的情况是我有

    .NotEmpty()
    

    .NotNull()
    

    同时,只需要一个。

    【讨论】:

      【解决方案3】:

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

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

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

      【讨论】:

      • 让我免于浪费更多时间...感谢这完全解决了您描述的问题
      【解决方案4】:

      请更新 web.config 文件:

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

      【讨论】:

        【解决方案5】:

        在我的例子中,我同时在验证规则中添加了 NotEmpty 和 Length 条件。

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

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2020-10-26
          • 1970-01-01
          • 1970-01-01
          • 2021-02-19
          • 2012-04-15
          相关资源
          最近更新 更多