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)
サーバー上の検証をモデル全体 (単一のプロパティ/フィールドだけでなく) に適用する方法について、誰かが光を当てることができますか?
ありがとう、リチャード