目立たないクライアント検証ルールの検証タイプ名は一意である必要があります。次の検証タイプが複数回見られました:必須
これは、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; }
}
ここでは、同じタイプの検証ルールを2回使用していません。これはローカルで正常に機能しますが、サーバーにデプロイした場合は機能しません。どうしたんだ?
DataAnnotationExtensions
( http://dataannotationsextensions.org )への参照を追加しましたが、それが問題を引き起こしているのではないですか?
編集:参照を削除しても問題は解決しませんでした。 IIS configuration?
JimmiThのコメント 質問は、これを自分で解決するための重要な洞察を提供してくれました。
私の場合、ModelValidatorProviders
にプロバイダーを追加しました。私のGlobal.asax.csファイルに次のコードを使用して、カスタム検証ファクトリー( Fluent Validation を使用)を追加しました。
ModelValidatorProviders.Providers.Add(
new FluentValidationModelValidatorProvider(validatorFactory));
しかし、複数のプロバイダーを使用することは必ずしも問題ではありません。問題と思われるのは、複数のプロバイダーが同じバリデーターを提供する場合です。これにより、同じルールが複数回登録され、Microsoftの控えめな検証コードで前述の問題が発生します。
両方のプロバイダーを使用する必要がないと判断したため、同じファイルから次の行を削除してしまいました。
FluentValidationModelValidatorProvider.Configure();
上記のConfigure
メソッド自体がModelValidatorProviders
にプロバイダーを追加しており、同じバリデータークラスを効果的に2回登録していたため、一意でない「検証タイプ名」に関するエラーが発生しました。
SO質問 jquery-Fluent Validations。エラー:控えめなクライアント検証ルールの検証タイプ名は一意である必要があります 複数のプロバイダーを使用すると、前述のようになる別の方法を指します問題。各プロバイダーは、「暗黙の必須属性を「値の型」に追加するように構成できます(つまり、null可能ではないビューモデルプロパティ)。この特定の問題を解決するには、コードを次のように変更して、プロバイダーは暗黙の必須属性を追加します。
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;
私のケースは私が持っていたということでした
.NotEmpty()
そして
.NotNull()
同時に、必要なのは1つだけです。
FluentValidationをDataAnnotationsと並べて使用している場合、これが発生する可能性があります。
FluentValidationが動作している場合、Application_Startメソッドで登録されたModelValidatorProvidersからDataAnnotationsModelValidatorProviderを削除する必要がある場合があります。
FluentValidationModelValidatorProvider.Configure();
// Remove data annotations validation provider
ModelValidatorProviders.Providers.Remove(
ModelValidatorProviders.Providers.OfType<DataAnnotationsModelValidatorProvider>().First());
Web.configファイルを更新してください:
<configuration>
<appSettings>
<add key="ClientValidationEnabled" value="true"/>
<add key="UnobtrusiveJavaScriptEnabled" value="true"/>
</appSettings>
</configuration>
私の場合、NotEmptyとLengthの両方の条件を検証ルールに同時に追加しました。
RuleFor(x => x.Code).NotEmpty().Length(1, 10);
NotEmpty条件を削除すると、エラーが消えました。