2016-04-04 31 views
1

CQRS desenini kullanıyoruz ve akıcı doğrulama işleminin hata işleme ile ilgili bir sorunumuz var. (https://lostechies.com/jimmybogard/2015/05/05/cqrs-with-mediatr-and-automapper/ @ CQRS desen)Akıcı Doğrulama Validasyonu, MVC içinde

public class OtherSpecified : AbstractValidator<Command> 
{ 
    public OtherSpecified(ApplicationDbContext context) 
    { 
     RuleFor(x => x.Other).NotNull(); 
    } 
} 

public class DepartmentSpecified : AbstractValidator<Command> 
{ 
    public DepartmentSpecified(ApplicationDbContext context) 
    { 
     RuleFor(x => x.Department).NotNull(); 
    } 
} 

Şimdi bu yüzden biz http://lostechies.com/jimmybogard/2014/09/09/tackling-cross-cutting-concerns-with-a-mediator-pipeline/ gelen bilgi dayalı birden soyut doğrulayıcı çalıştırabilirsiniz bizim doğrulama işleyicisi enjekte edin. Bu foreach döngüsü

public TResponse Handle(TRequest request) 
{ 
    var context = new ValidationContext(request); 
    var result = new ValidationResult(); 

    var list = _validators.ToList(); 
    foreach (var validator in list) 
    { 
     var results = validator.Validate(request); 
     foreach (var validationFailure in results.Errors) 
     { 
      result.Errors.Add(validationFailure); 
      //temp testing code below 
      if (results.Errors.Count > 0) 
       throw new ValidationException(result.Errors); 

     } 
    } 

    if (result.Errors != null && 
     result.Errors.Count > 0) 
    { 
     throw new ValidationException(result.Errors); 
    } 
    return _inner.Handle(request); 
} 

sorun akıcı doğrulama istisna (ValidationException) ele olmamasıdır çalışan kuralları görebilirsiniz, çünkü bu ancak çalışır. Kural hataları

Açıklama olarak yukarı kabarcıklar: işlenmeyen bir özel durum geçerli web isteği yürütülürken oluştu. Daha fazla hatayla ilgili bilgileri ve kodda nereden kaynaklandığını öğrenmek için yığın izini gözden geçirin.

durum ayrıntıları: FluentValidation.ValidationException: Doğrulama başarısız oldu: Ne beklenebilir olduğunu

Akıcı doğrulama hatası işlemek ve doğrulama hataları gibi json ajax isteği geri

+0

kadar Tel. Sorununuzu anlıyorum, ancak gerçek şu ki, doğrulama istisnalarını otomatik olarak ele almıyor, yapmanız gerekiyor. Tanımladığınız şeyi yapmak için özel kod yazabilirsiniz, ancak otomatik olarak yapılmaz. – nhouser9

cevap

3

I geçmek Bir HandleErrorAttribute ile ValidationException yakalamak ve json ajax isteğine dönmek.

public class ValidationExceptionHandlerErrorAttribute : HandleErrorAttribute 
    { 
     public override void OnException(ExceptionContext filterContext) 
     { 
      //only handle ValidationExceptions 
      if ((filterContext.Exception as ValidationException) != null) 
      { 
       var result = new ContentResult(); 
       //Add errors to Model State so they are handled auto-magically 
       foreach (var validationsfailures in (filterContext.Exception as ValidationException).Errors) 
       { 
        filterContext.Controller.ViewData.ModelState.AddModelError(validationsfailures.PropertyName,validationsfailures.ErrorMessage); 
       } 
       //convert to json and return to ajax request 
       string content = JsonConvert.SerializeObject(filterContext.Controller.ViewData.ModelState, 
        new JsonSerializerSettings 
        { 
         ReferenceLoopHandling = ReferenceLoopHandling.Ignore 
        }); 
       result.Content = content; 
       result.ContentType = "application/json"; 
       filterContext.HttpContext.Response.StatusCode = 400; 
       filterContext.HttpContext.Response.TrySkipIisCustomErrors = true; 
       filterContext.Result = result; 
       filterContext.ExceptionHandled = true; 
      } 
     } 
    } 

ve ben Sorunuz çok spesifik değildir burada

public class FilterConfig 
{ 
    public static void RegisterGlobalFilters(GlobalFilterCollection filters) 
    { 
     .. 
     .. 
     filters.Add(new ValidationExceptionHandlerErrorAttribute()); 
    }