0

FluentValidation を使用する際に、データベース モデルと部分クラスなどを含む別の .dll があります (デスクトップ バーコード端末と Web サイトの両方で使用されます)。

デスクトップアプリの場合、以下のようなすべてのエラーを読み取って表示できます

public override int SaveChanges()
    {
        var errors = this.GetValidationErrors();
        if (errors.Any())
        {
            //handle validation errors
            return 0;
        }
        else
        {
            return base.SaveChanges();
        }
    }

MVC サイトでは、個々のモデルにバリデーターをセットアップしたり、データ注釈を作成したりして、それらを正常に動作させることができます (これは私が望んでいることではありません)。私が頭を悩ませているのは、ビューに流暢な検証メッセージを表示できるように、モデルをエンティティに強制的にマップする方法です。2 つの別個のロジック セットを維持する必要はなく、バーコード アプリと Web サイトで同じものを使用する必要があります。

エンティティをビューに直接マップする必要がありますか? これは悪いことであり、あまり柔軟ではないと私は信じさせられてきました。または、モデル内のフィールドがエンティティの 1 つの属性にマップされていることを示す方法はありますか? おそらく何らかの説明の注釈です。

編集:

必要な検証の種類を明確にするだけです。

ほとんどのフロント エンドの入力タイプの検証は引き続き viewModels に残ります (必須/長さ/パスワードの一致など - 基本的にクライアント側の検証にも使用できるすべてのもの)。しかし、私が望んでいないすべてのビジネス ロジックの検証があります。他のオプションを設定する前に電子メールアドレスを検証する必要があり、アカウント番号は名前に基づいた特定の形式にする必要があります (これは正規表現ではできません)。この特定の日付は、有効な配達日などではありません。

私ができることの 1 つは、これらを ValidationSummary に追加して、個々のフィールドとは別に表示することだと思います。

4

2 に答える 2

1

ただの更新。必要な 2 層の検証を取得するには、すべてのエンティティ モデル クラスを IValidatable としてマークする必要がありました。次に、各クラスの検証メソッドをオーバーライドし、流暢な検証バリデーター メソッドを呼び出して、必要なエラーを返しました。modelstate.addmodelerror の場合、キーをフィールド名として設定し、問題なくマップし直しました。もう少しコードですが、動作します。この悪い更新を行うためのより良い方法を見つけたら。

于 2013-04-08T17:00:33.533 に答える