1

Breeze.js (0.84.3)がクラス レベルでサーバー モデルに適用されたカスタム検証属性によって設定されたエラー メッセージをクライアントに返さない理由がわかりません。次のように、Breeze TODO KO サンプルでこれを再現できます。

using System;
using System.ComponentModel.DataAnnotations;
namespace Todo.Models
{
    [MyCustomValidator] // NEW
    public class TodoItem
    {
        public int Id { get; set; }
        [Required, StringLength(maximumLength: 30)]     
        public string Description { get; set; } // Set to 'error' to trigger server error.        
        public System.DateTime CreatedAt { get; set; }  
        public bool IsDone { get; set; }                
        public bool IsArchived { get; set; }            
    }

    [AttributeUsage(AttributeTargets.Class)] // NEW
    public class MyCustomValidator : ValidationAttribute
    {
        public override Boolean IsValid(Object value)
        {           
            var todo = value as TodoItem;
            if (todo.Description == "error")
            {
                ErrorMessage = "The TodoItem is not valid!";
                return false;
            }
            return true;
        }
    }
 }

「TodoItem は有効ではありません!」というエラー メッセージが表示されると思います。クライアントに返されますが、Breeze は常にサーバーから「値を null にすることはできません。パラメータ名: ソース」を返すようです。次の場所で例外が発生しているようです。

StackTrace:   
at System.Linq.Enumerable.Select[TSource,TResult](IEnumerable`1 source, Func`2 selector) at Breeze.WebApi.EFContextProvider`1.SaveChangesCore(Dictionary`2 saveMap)
at Breeze.WebApi.ContextProvider.SaveChanges(JObject saveBundle)
at Todo.Controllers.TodosController.SaveChanges(JObject saveBundle) in c:\Users\RichardH\Downloads\Software\Web\breeze-runtime-plus-0.84.3\Samples\Todo\Todo\Controllers\TodosController.cs:line 41
at lambda_method(Closure , Object , Object[] )
at System.Web.Http.Controllers.ReflectedHttpActionDescriptor.ActionExecutor.<>c__DisplayClass13.<GetExecutor>b__c(Object instance, Object[] methodParameters)
at System.Web.Http.Controllers.ReflectedHttpActionDescriptor.ActionExecutor.Execute(Object instance, Object[] arguments)
at System.Web.Http.Controllers.ReflectedHttpActionDescriptor.<>c__DisplayClass5.<ExecuteAsync>b__4()
at System.Threading.Tasks.TaskHelpers.RunSynchronously[TResult](Func`1 func, CancellationToken cancellationToken)

サーバー上の検証をモデル全体 (単一のプロパティ/フィールドだけでなく) に適用する方法について、誰かが光を当てることができますか?

ありがとう、リチャード

4

2 に答える 2

3

まず、Breeze.NETサーバー側のメタデータは、カスタムサーバー検証属性をBreezeクライアントに伝達しません。これは、Required、MaxLength、StringLengthなどの特定の標準的なもののみを伝達します。クライアントで検証を複製する場合は、検証ドキュメントで説明されているように、クライアントでJavaScriptでバリデーターを記述し、クライアント側のメタデータに登録する必要があります。

次に、EFがカスタム検証ルールを使用しようとしているため、EF内で障害が発生していると思います。例外は、EFContextProviderがEFに変更を保存するように要求するSaveChangesCore内でスローされます。

スタックトレースによるとSelect、Breezeが検証エラーについて通知しようとしているステートメントから発生するLINQ例外である可能性があります。私はここで意味Selectします

var formatedKey = key.EntitySetName + ";" +
                    key.EntityKeyValues.Select(v => v.ToString())。ToAggregateString( "、");

「値をnullにすることはできません...」というメッセージは、それkey.EntityKeyValuesがnullであることを示しています。キー値なしであなたのエンティティがここに到達した方法を説明することはできません。ブレークポイントを設定して調べることができると思います。

私たちの側では、この回線の脆弱性を減らす必要があります。それを修正するもののリストに入れます。

于 2013-01-15T08:05:27.320 に答える
1

OK、これはバグで、breeze v1.0.0 で修正されました。

于 2013-01-29T02:41:30.267 に答える