5

私は私を絶対に夢中にさせている奇妙な問題を抱えています。

それがうまく機能した後、それは突然の次のエラーで始まりました:

Validation type names in unobtrusive client validation rules must be unique. The following     
validation type was seen more than once: required

このエラーは、Area / Admin/WebSitesのコントローラーの1つで最初に発生しました。しかし、認証Cookieの有効期限が切れるとすぐに、ログインページとEditFor(m => m.UserName)行でCookieを取得しました。私は自分のコードをくまなく調べて、リモートで同じ名前が付けられている可能性のあるモデルのどこかに重複するRequired属性を探しました。

LoginViewModelにアクセスし、UserNameから[Required]を削除しました。エラーはEditFor(m => m.Password)に移動しました。「パスワードから必須」も削除しました。エラーによりRememberMe行が移動しましたが、そのメンバーには必須属性がまったくありませんでした。実際、他のクラスでは、RememberMeという名前のリモートでさえ他に何もありません。

さて、私はあきらめて、webSiteプロジェクトを最初から再構築し始めました(ソリューションの残りの部分ではありません)が、それでも同じ結果になりました。

必死になって、ソリューション全体を最初から再構築し、*。csファイルをコピーして、どこかに重複する参照があると考えてすべての参照を手動で再読み込みします。

MVC4プロジェクトをもう一度構築する段階に到達したら、何が起こっているのかを理解できるかどうかを確認するために段階的に実行しました。エリアの追加を開始するまでは、正常に動作し、読み込みが完了し、ログインなどが可能でした。最初は、Areasフォルダーをプロジェクトに直接コピーしました(名前空間名はすべて同じなので、これで問題ないはずです)。しかし、確かに私はこのエラーを正しい方法で取得し始めました。

さて、最初に作成したのとは逆の順序でコントローラーを削除し始めました。Areasフォルダーを完全に削除するまで、サイトは通常の状態に戻りませんでした。

これをテストすると、プロジェクトにAreasフォルダーを作成するとすぐに、壊れてしまいます。GUIを使用して新しいエリアを作成した場合も同じです。

さて、製図板に戻ります。MVC4プロジェクトを最初から再作成しましたが、今回はソリューションの外部で、この時点でソリューションにとって重要な2つの重要なNuGetパッケージ(Ninject.MVC3とMvc3ControlsKit(3と4の両方に対応するnugetからのもの)のみを取り込みました)。さて、すべてがようやくうまく機能し始めます。この時点で、私のJqueryはバージョン1.7.2であり、MVC4に付属するデフォルトのJqueryUIを備えています。

ある時点で、jqueryダイアログが閉じないという問題が発生したため、JQuery1.8.2とNuGetの最新のJQueryUIをインストールしました。管理エリアに完全に空白のコントローラーを追加し、このエラーが再び表示されるまで、すべてが正常に機能しました。

さて、再び製図板に戻ります...私は段階的にそれを再構築し、各ポイントでテストしました。今回は最新のJQueryグッズをインストールしていません。すべてが再び正常に機能し始めます。新しいコントローラーを追加し、次に2つ追加しました。さて、このバージョンの有効なコピーを作成し、取っておきます。JqueryとJqueryUIを最新バージョンに更新しました。そのエリアに新しいコントローラーを追加しても、それでも私の完全な欲求不満に対応できます。

私のエンティティはすべてFluentAPIを使用して、DataAnnotatian属性をまったく使用せずにエンティティを構成しています。何か案は?私はそれが再び壊れるのを待ち続けます。

編集:

これが私がちょうど理解したいくつかのより多くの情報です。ログイン部分ビューのこのコード行でエラーが発生しています。私のモデルは

public class LoginViewModel 
{
    [Required]
    [Display(Name = "User Name")]
    public string UserName { get; set; }

    [Required]
    [DataType(DataType.Password)]
    [Display(Name = "Password")]
    public string Password { get; set; }

    [Display(Name = "Remember me?")]
    public bool RememberMe { get; set; }

    /// <summary>
    /// Role
    /// </summary>
    public string Role { get; set; }

}

ビューでこの行を呼び出すと、エラーが発生します。

@Html.TextBoxFor(m => m.UserName)

この時点で、Ninjectが引き継ぎ、Ninject.Web.Mvc.Validation.NinjectDataAnnotationsModelValidatorProviderクラスの次のメソッドから戻った直後に、前述の控えめな検証エラーが発生します。さらに、このメソッドが必要な検証を正しく識別し、それらを注入したことを確認しました。このメソッドでは例外は発生していませんが、その後発生しています。

protected override IEnumerable<ModelValidator> GetValidators(ModelMetadata metadata, ControllerContext context, IEnumerable<Attribute> attributes)
    {
        var validators = base.GetValidators(metadata, context, attributes);
        foreach (var modelValidator in validators.OfType<DataAnnotationsModelValidator>())
        {
            var attribute = this.getAttributeMethodInfo.Invoke(modelValidator, new object[0]);
            this.kernel.Inject(attribute);
        }

        return validators;
    }
4

4 に答える 4

12

解決策(Ninjectが使用されている場合)は、バインディングのバインドを解除することです。

kernel.Unbind <ModelValidatorProvider>();

于 2013-09-30T12:36:21.063 に答える
5

このエラーは、プロジェクトで混合検証ソリューションを使用しようとしていて、2つのプロバイダーがフィールドに目立たない必要な検証を追加しようとしているために発生するため、重複する問題が発生します。

dataannotationとfluentvalidationの両方を使用して、同じプロパティに対して同じ検証を実行していないことを確認してください(あなたの場合に必要なように)。

于 2012-10-09T12:41:58.993 に答える
2

これは、この問題に関するすべての人にとって必ずしも満足のいく答えではありませんが、DIをUnityに切り替えることで問題を解決しました。はい、マークが言ったように、それはおそらく混合検証によるものであると私は判断しました。コードでDataAnnotationを使用しています。Ninjectが社内でFluentValidationを使用している可能性がありますが、確実に伝えるには十分な知識がなく、自分自身に満足のいく答えを見つけたため、この追求を続けるエネルギーがありません。

私はNinjectが好きですが、私の場合、最新バージョンのUnityは、1つのファイル(bootstrapper.cs)を追加し、起動イベントからBootStrapper.BuildUnityContainer()を呼び出すだけなので、実際には同じように簡単に使用できます。それで、私は今のところこの解決策に固執します。

于 2012-10-18T00:08:44.277 に答える
1

流暢な検証を使用していたMVC4プロジェクトでも同じエラーが発生しました。私の間違いは、.NotNull()と.NotEmpty(同じフィールドに対して)を使用したことです。

RuleFor(i => i.SomeValue).NotNull().NotEmpty();

最後の.NotEmpty()を削除すると、問題が解決しました。

于 2014-10-07T07:50:14.213 に答える