1

プロパティtypeidとsalaryを持つエンティティPersonがあるとします。この 2 つのプロパティに対して、次のようなビジネス ルールを作成します。

public static partial class MyRules
    {
        public static ValidationResult Rule1(Person p, ValidationContext context)
        {           

            if ((p.typeid == 1) && ((p.salary == null))
            {
                return new ValidationResult("type 1 must should have salary",
                                            new string[] { "Salary" });
            }

            return ValidationResult.Success;
        }
    }

コードは、share.cs を使用してサーバー側に配置されます。

したがって、ルールに違反すると、SubmitOperation.HasError = true; になります。この種のエラーは、SubmitChanges を呼び出した後にのみ発生します。ValidationSummary にエラーが表示されない

そのため、SubmitOperation.HasError = true; SubmitOperation エラーが検証エラーであり、他のエラーではないことをどのように知ることができますか? このエラーを検証エラーとして識別できる場合、「タイプ 1 には給与が必要です」という検証エラー メッセージを取得してユーザーに表示するにはどうすればよいですか?

4

1 に答える 1

1

私はこれがほぼ 1 年前のものであることを知っています。それにもかかわらず、誰もそれに答えていません。そして、私はまだ質問に答えていませんが、答えは知っています (または少なくとも 1 つの可能な答え) (お願いします (そしてありがとう) 回答済みとしてマークしてください)。以下は、送信操作が完了したときに検証結果を処理する方法です。SubmitChanges を呼び出すときは、コールバックとユーザー状態を指定してオーバーロードを呼び出す必要があります。コールバック (InsertEntityCompleted) で op.userstate をコールバックと呼んでいるため、少し混乱するかもしれませんが、このインスタンスではユーザー状態がどのように使用されているかを示しています。

private void InsertEntityCompleted( SubmitOperation op )
    {
        var callback = op.UserState as Action<Exception, ICollection<ValidationResult>>;
        if ( callback != null )
        {
            var validationResults = new Collection<ValidationResult>();
            if ( op.HasError )
            {
                foreach ( var entity in op.EntitiesInError )
                {
                    //HOW YOU KNOW SUBMIT OPERATION ERROR IS VALIDATION ERROR
                    if ( entity.HasValidationErrors )
                        foreach ( var validationResult in entity.ValidationErrors )
                        {
                            //HOW YOU WOULD GET THE ERROR MESSAGES AND MEMBER NAMES
                            var name = validationResult.MemberNames;
                            var error = validationResult.ErrorMessage;
                            validationResults.Add(validationResult);
                        }

                }
                op.MarkErrorAsHandled();
            }
            //HOW YOU IDENTIFY ERROR AS VALIDATION ERROR AND NOT OTHER TYPE OF ERROR
            if ( op.Error != null &&
                op.Error is DomainOperationException &&
                ( op.Error as DomainOperationException ).Status == OperationErrorStatus.ValidationFailed )
                //I CALLBACK NULL FOR EXCEPTIONS, BUT I KEEP THE VALIDATION RESULTS ON VALIDATION ERRORS
                //THEN TO SHOW IT TO THE USER I IMPLEMENT INotifyDataErrorInfo IN MY VIEWMODEL 
                //AND MANAGE THE ERRORS THROUGH THAT IMPLEMENTATION, THE BOUND CONTROL SHOULD HAVE 
                //NotifyOnValidationError=True DEFINED IN THE BINDING
                callback( null, validationResults );
            else
                callback( op.Error, validationResults );
            _entityContext.Enitities.EntityContainer.Clear();
        }
    }
于 2011-08-16T18:40:43.987 に答える