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; }
}
:ここ
は、私が経験していますこの問題を再作成するためにいくつかの命令です。
- 「藤堂」のサンプルを作成するための指示に従ってください(http://www.breezejs.com/documentation/start-nuget)
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; } }
を提出バリデータ:
[CustomValidator] public string Description { get; set; }
適切な使用方法もちろん( "System"と "System.ComponentModel.DataAnnotations")。
- プロジェクトを実行します。
- 説明フィールドの1つに「Error」と入力して保存します。
ここでは、エラーがbreezeを突き抜けたり、Entity Frameworkから「DbEntityValidationException」がスローされることが予想されます。私は2つの別々のコンピュータで同じ結果を試しました。エンティティは、エラーがないかのようにデータベースに保存します。実際に、カスタムバリデータのIsValidメソッドのどこにでもブレークポイントを置くと、呼び出されていないことがわかります。
こんにちは、お返事ありがとう、素晴らしいプロジェクトです!私は経験している問題を再現する方法の例を提供するために質問を編集しました。私が実行した問題は、EFContextProvider.SaveChanges(saveBundle)メソッドを使用しているときにデータ注釈が評価されていないことです。私はBreezeのソースコードをプルダウンし、EFContextProvider.SaveChangesCoreメソッドのコードをObjectContext.SaveChanges()の代わりに((DbContext)(オブジェクト)Context).SaveChanges()を使用して変更すると、注釈が正しく評価されます。しかし、私はむしろソースを変更しないでください。 – adamlj
さらにもう1つ、私はBeforeSaveメソッドをチェックアウトしました。私の懸念は、私はブールだけ返すことができるということです。検証エラーの場合は、ユーザーにエラーメッセージを返すための方法が必要です。 – adamlj
失敗の説明を含む例外をスローする必要があります。たとえば、 'throw new InvalidOperationException("不明な型のエンティティを保存できません ");' falseを返すと、ContextProviderは保存中にそのエンティティをスキップするように指示します。それは保存を終了しません! 「[サーバー側の代行受信](http://www.breezejs。 – Ward