web-dev-qa-db-ja.com

目立たないクライアント検証ルールの検証タイプ名は一意である必要があります

目立たないクライアント検証ルールの検証タイプ名は一意である必要があります。次の検証タイプが複数回見られました:必須

これは、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回使用していません。これはローカルで正常に機能しますが、サーバーにデプロイした場合は機能しません。どうしたんだ?

DataAnnotationExtensionshttp://dataannotationsextensions.org )への参照を追加しましたが、それが問題を引き起こしているのではないですか?

編集:参照を削除しても問題は解決しませんでした。 IIS configuration?

34
Josh M.

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; 
20
Kenny Evitt

私のケースは私が持っていたということでした

.NotEmpty()

そして

.NotNull()

同時に、必要なのは1つだけです。

13
PmanAce

FluentValidationをDataAnnotationsと並べて使用している場合、これが発生する可能性があります。

FluentValidationが動作している場合、Application_Startメソッドで登録されたModelValidatorProvidersからDataAnnotationsModelValidatorProviderを削除する必要がある場合があります。

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

Web.configファイルを更新してください:

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

私の場合、NotEmptyとLengthの両方の条件を検証ルールに同時に追加しました。

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

NotEmpty条件を削除すると、エラーが消えました。

0
basic