2012-12-13 20 views
5

Breezeを見て、私は多くの機能に感銘を受けました。Breezeサーバー側の検証

サーバーサイドのDbContext検証エラーをクライアントに返す方法を理解するのに問題があります。 Breezeには、「必須」などの属性のいくつかに反応するデフォルトのバリデータがありますが、他のすべての属性はどうですか?クライアントサイドでチェックするBreeze用のカスタムjavascriptバリデータを書くこともできますが、エンティティがサーバ側で有効であることを確認する必要があります。

例:アプリケーションでは、有効な電子メールアドレスを持つには "Person"が必要です。悪意のあるユーザーがメールアドレスを取得し、「EmailAddress」バリデーターを通過しない日付でサーバーに送信します。これまでのところ私のBreezeの経験は、電子メールアドレスが保存され、DbContext/Entity Frameworkのエラーをバブルアップしないということです。

以下のモデルを前提とすると、エンティティ検証エラーを得るにはどうすればよいでしょうか? UPDATE 1

public class PeopleContext : DbContext 
{ 
    public PeopleContext() 
     : base("name=ConnectionString"){ } 

    public DbSet<Person> People { get; set; } 
} 

public class Person 
{ 
    public int PersonId { get; set; } 
    public string FirstName { get; set; } 
    [Required] 
    public string LastName { get; set; } 
    [EmailAddress] 
    [Required] 
    public string Email { get; set; } 
} 

:ここ

は、私が経験していますこの問題を再作成するためにいくつかの命令です。

  1. 「藤堂」のサンプルを作成するための指示に従ってください(http://www.breezejs.com/documentation/start-nuget
  2. BreezeSampleTodoItem.csに新しいカスタムバリデータを追加します。新しいカスタムと説明フィールドを飾る

    [AttributeUsage(AttributeTargets.Property)] 
    public class CustomValidator : ValidationAttribute 
    { 
        public override Boolean IsValid(Object value) 
        { 
         string val = (string)value; 
         if (!string.IsNullOrEmpty(val) && val == "Error") 
         { 
          ErrorMessage = "{0} equal the word 'Error'"; 
          return false; 
         } 
         return true; 
        } 
    } 
    
  3. を提出バリデータ:

    [CustomValidator] 
    public string Description { get; set; } 
    
  4. 適切な使用方法もちろん( "System"と "System.ComponentModel.DataAnnotations")。

  5. プロジェクトを実行します。
  6. 説明フィールドの1つに「Error」と入力して保存します。

ここでは、エラーがbreezeを突き抜けたり、Entity Frameworkから「DbEntityValidationException」がスローされることが予想されます。私は2つの別々のコンピュータで同じ結果を試しました。エンティティは、エラーがないかのようにデータベースに保存します。実際に、カスタムバリデータのIsValidメソッドのどこにでもブレークポイントを置くと、呼び出されていないことがわかります。

答えて

3

Breeze v 0.78.1以降、登録されたすべてのDbContextサーバー側の検証は、EntityManager SaveChanges呼び出し中に実行されるようになりました。発生した例外はすべてロールバックされ、検証エラーはBreezeクライアントにシリアル化されます。

この機能は、従来のObjectContext(DbContextではなく)ベースのEFモデルではまだサポートされていません。

...この問題を発見し、解決策を提案してくれたadamljに感謝します。

1

私はあなたが検証エラーメッセージがしたいことを意味する可能性があり、クライアントに

あなたは、サーバー側DbContextの検証エラーを取得

によって何を意味するかわからないんだけどクライアントに送信されます。しかし、あなたの質問の残りの部分は、(a)サーバー上でカスタム検証を実行する方法と、(b)クライアント上でその検証の対応するJavaScriptバージョンを取得して実行する方法を知りたいことを示唆しています。私はあなたの質問のこの解釈に対処します。

(あなたはあなたの例で使用している)Entity Frameworkのサーバーは自動的に無効にした場合を除き、手動備わっている... データ注釈あなたのために検証ルールを実行します。 カスタムの検証規則を適切な方法で作成すると、EFもこれを実行します。 This post by Daniel Wertheimは、そのようなルールの記述方法について説明しています。私はすべての細部にそのポストを保証することはできませんが、それは私に正しいようです。それはカスタムEmail-validation属性を定義することさえできます!

カスタムデータアノテーション検証ルールのオーサリングがバロックすぎるようである場合は、「Server-side Interception」で説明したBeforeSave...メソッドの1つで独自の検証ロジックを作成して呼び出すことができます。

私はこれらがあなたの最良のサーバーオプションだと思います。クライアントに...

クライアント

ブリーズは遭遇し、サーバー側の特定のデータ注釈(例えば、RequiredMaxLength)と一致するクライアント側のJavaScriptの検証を登録しますメタデータ内のワイヤ。私が書いたように、カスタムデータアノテーションは、メタデータに認識されず、またメタデータにも含まれておらず、クライアント上ですぐに使用できるアナログはありません。クライアントがこれらのルールを使用してエンティティを事前検査するようにするには、対応するJavaScriptバリデーターを作成し、Validationドキュメントページで説明されているように、該当するエンティティタイプに登録する必要があります。

あなたに提案やより良い選択肢があるなら、私たちはそれを聞いてみたいです。

+0

こんにちは、お返事ありがとう、素晴らしいプロジェクトです!私は経験している問題を再現する方法の例を提供するために質問を編集しました。私が実行した問題は、EFContextProvider.SaveChanges(saveBundle)メソッドを使用しているときにデータ注釈が評価されていないことです。私はBreezeのソースコードをプルダウンし、EFContextProvider.SaveChangesCoreメソッドのコードをObjectContext.SaveChanges()の代わりに((DbContext)(オブジェクト)Context).SaveChanges()を使用して変更すると、注釈が正しく評価されます。しかし、私はむしろソースを変更しないでください。 – adamlj

+0

さらにもう1つ、私はBeforeSaveメソッドをチェックアウトしました。私の懸念は、私はブールだけ返すことができるということです。検証エラーの場合は、ユーザーにエラーメッセージを返すための方法が必要です。 – adamlj

+0

失敗の説明を含む例外をスローする必要があります。たとえば、 'throw new InvalidOperationException("不明な型のエンティティを保存できません ");' falseを返すと、ContextProviderは保存中にそのエンティティをスキップするように指示します。それは保存を終了しません! 「[サーバー側の代行受信](http://www.breezejs。 – Ward

関連する問題