Пользовательский атрибут ValidationAttribute возвращает исключение вместо ValidationMessage - PullRequest
2 голосов
/ 25 февраля 2020

У меня есть пользовательский валидатор, который проверяет, существует ли значение поля в таблице базы данных (если это так, тогда проверка верна), отладка кода фактически выполняет проверку, НО, когда она ложна, выдает следующее исключение:

System.Data.Entity.Validation.DbEntityValidationException: 'Validation failed for one or more entities. See 'EntityValidationErrors' property for more details.'

При проверке подробностей ошибка возникает, когда проверка возвращает ложное условие IsValid (false)

Класс проверки выглядит следующим образом:

public class dotValidator : ValidationAttribute
    {
        protected override ValidationResult IsValid(object value, ValidationContext validationContext)
        {
            string valRut = value.ToString();
            valRut = valRut.ToUpper();
            valRut = valRut.Replace(".", "");
            valRut = valRut.PadLeft(valRut.Length + 10, '0');

            using (entity1 db = new entity1())
            {
                var validation = db.viewDot.Where(x => x.RUT_DV == valRut).FirstOrDefault();

                if (validation == null)
                {
                    return new ValidationResult(this.FormatErrorMessage(validationContext.DisplayName));
                }
                return ValidationResult.Success;
            }
        }
    }

Проверка модели:

[dotValidator(ErrorMessage="Value doesnt exists! Check the field again.")]
public string rutColaborador { get; set; }

И в строке POST db.SaveChanges() отображается исключение:

[HttpPost]
        public ActionResult AddReg(licenciasUsuario lic, string FileUpload)
        {

            using (entity1 db = new entity1())
            {


                if (ModelState.IsValid) { 
                    //DO STUFF TO STORE INTO DE DB HERE
                    //Exception here!
                    db.SaveChanges();


                    return Json(new { success = true, message = "Row added." }, JsonRequestBehavior.AllowGet);
                }
                else
                {
                    return ViewBag.Message;
                }
            }

        }

Могу ли я "пропустить" исключение и показать вместо него @Html.ValidationMessageFor?

1 Ответ

1 голос
/ 25 февраля 2020

Ваш код выдает DbEntityValidationException исключение.

DbEntityValidationException - это исключение, генерируемое Entity Framework при сбое проверки сущности. Хотя это исключение чрезвычайно ценно, в сообщении об исключении пропущен самый важный бит информации.

Самое простое решение - переопределить SaveChanges в вашем DbContext. Вы можете поймать DbEntityValidationException, развернуть фактические ошибки и создать новое DbEntityValidationException с улучшенным сообщением.

Пример:

public class ApplicationDbContext:DbContext
{
      //....................................
      //....................................
      /*........ your DbSet other..........*/
      //....................................
      //....................................

public override int SaveChanges()
{
    try
    {
        return base.SaveChanges();
    }
    catch (DbEntityValidationException ex)
    {
        // Retrieve the error messages as a list of strings.
        var errorMessages = ex.EntityValidationErrors
                .SelectMany(x => x.ValidationErrors)
                .Select(x => x.ErrorMessage);

        // Join the list to a single string.
        var fullErrorMessage = string.Join("; ", errorMessages);

        // Combine the original exception message with the new one.
         var exceptionMessage = string.Concat(ex.Message, " The validation errors are: ", fullErrorMessage);

        // Throw a new DbEntityValidationException with the improved exception message.
        throw new DbEntityValidationException(exceptionMessage, ex.EntityValidationErrors);
    }
  }
}

Теперь вы можете найти исходное исключение. Надеюсь, это поможет вам.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...