1

Supposons que j'ai une entité Personne avec les propriétés typeid et salary. Je construis une règle métier pour ces deux propriétés comme:Comment obtenir une erreur de validation personnalisée?

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

Le code est mis à côté serveur avec share.cs. Donc, quand la règle est violée, je vais avoir SubmitOperation.HasError = true; Ce genre d'erreur seulement après l'appel SubmitChanges. et l'erreur ne s'affiche pas dans ValidationSummary

Ainsi, lorsque SubmitOperation.HasError = true; comment puis-je savoir que l'erreur SubmitOperation est une erreur de validation et non une autre erreur? Quand je peux identifier cette erreur comme erreur de validation, comment puis-je obtenir le message d'erreur de validation "type 1 doit avoir un salaire" et le montrer à l'utilisateur?

Répondre

1

Je sais que cela a presque un an; néanmoins, personne n'y a répondu. Et je n'ai pas encore répondu à des questions mais je connais la réponse, (ou au moins 1 réponse possible) (merci (et merci) de répondre). Voici comment je gère les résultats de validation sur les opérations de soumission lorsqu'elles sont terminées. Lorsque vous appelez SubmitChanges, vous devez appeler la surcharge avec un rappel et un état utilisateur. Cela peut être un peu déroutant car dans le callback (InsertEntityCompleted) j'appelle l'op.userstate un callback, mais c'est comme ça que l'état de l'utilisateur est utilisé dans cette instance.

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