2

NerdDinnerの例では、モデルのデータを検証する一連のビジネス ルールが記述されています。空の文字列のようなものがチェックされ、 modelObject.GetRuleViolations() を呼び出すことでそれらすべてを取得できます。しかし、データベースである検証の別のレイヤーがあります。たとえば、datetime フィールドは、DateTime オブジェクトに変換できる文字列のみを受け入れるデータベースへの検証のために残されます。

私が見る問題は、modelObject.GetRuleViolations() が datetime の違反を返さないことです。したがって、レコードの保存が正しく防止され、フォームが表示されてエラーが発生し、日時フィールドが強調表示されている場合でも、特定のエラー メッセージは表示されません。ビジネス ルールの検証エラーの中でデータベースの検証エラーを取得する方法はありますか?

4

3 に答える 3

2

データ アクセス レイヤーによってスローされた例外をキャッチし、ModelState を更新して問題のエラーを示す呼び出しに変換する必要があります。特定の SQL エラーは、一般的な方法で処理するのではなく、呼び出されたときにのみ解釈できるため、グローバル レベルでこれを行う良い方法はありません。

于 2009-05-19T07:06:00.697 に答える
0

あなたの仮定は間違っています。日時フィールドは、データベースでの検証のために残されていません。

NerdDinner/MVC のレッスンで理解しなければならなかったことの 1 つは、Dinner.cs の OnValidate() 部分メソッドと UpdateModel() への呼び出しの DinnersController.cs の両方で検証が行われることです。この呼び出しは、テキストを画面からモデルにコピーします。たとえば、テキストを float にコピーしようとしたり、無効な日付を解析しようとすると、ModelState が更新されてエラーがスローされます。通常の検証は実行されません。

于 2009-10-23T16:32:23.093 に答える
0

NerdDinner の正確なコードは覚えていませんが、見たことはあります。ただし、私のアプリケーションでは、通常、データベースで raiserror('Some error',16,1) を実行し、次のようにコントローラー/モデルで try/catch を使用します。

public void DoSomething() 
{
    try
    {
        // Some database activity
    } 
    catch (SqlException ex) 
    {
        ViewData["ErrorMessage"] = ex.Message;
    }
}

その後、必要に応じてビューにエラーをレンダリングできます。

于 2009-05-19T07:07:39.727 に答える