1

Предположим, у меня есть лицо Лицо со свойствами typeid и зарплатой. Я строил бизнес-правило для этих двух свойств, таких как:Как получить ошибку пользовательской проверки?

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 должен иметь зарплату» и показать его пользователю?

ответ

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(); 
     } 
    }