不显眼的客户端验证规则中的验证类型名称必须是 独特。以下验证类型不止一次出现: 需要
这是指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配置搞混了?
答案 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条件时,错误消失了。