Ошибки модели ASP.NET MVC 2 с пользовательскими исключениями - PullRequest
2 голосов
/ 27 октября 2010

У меня есть класс исключений:

public class MyException: Exception
{
   public MyException(MyExceptionEnum myError) : base(myError.ToDescription()) { }
   public MyException(MyExceptionEnum myError, Exception innerException) : base(myError.ToDescription(), innerException) { }
}

.ToDescription - это метод расширения для MyExceptionEnum, обеспечивающий сопоставление перечисления со строкой для подробностей ошибки исключения.

Вот как я его бросаю:

if (someCondition)
   throw new MyException(MyExceptionEnum.SomeError);

Поэтому я использую свой первый ctor, который создает новое исключение с данным сообщением.

Теперь на контроллере:

[HttpPost]
public ActionResult UpdateFoo(Foo model)
{
   try
   {
      _fooService.UpdateModel(model);
      _unitOfWork.Commit();
   }
   catch(MyException myException)
   {
      ViewData.ModelState.AddModelError("ModelErrors", myException);
   }

   return View("Index", model);
}

И, наконец, фрагмент из представления:

<%: Html.ValidationMessage("ModelErrors") %>

Не работает (исключение выдается при отладке, ошибка добавляется в состояние модели, но на странице ничего не отображается).

Но если я перейду к следующей строке:

ViewData.ModelState.AddModelError("ModelErrors", myException.Message);

Это работает.

AddModelError имеет две перегрузки:

  1. строка, исключение (у меня не работает)
  2. строка, строка (работает)

Какая польза от первой перегрузки тогда? У моего исключения есть внутреннее сообщение об исключении, поэтому я мог бы подумать, что расширение HTML отобразит это?

Как мы тогда обрабатываем пользовательские исключения с ModelState? Правильно ли используется вторая перегрузка?

1 Ответ

5 голосов
/ 27 октября 2010

Не имеет значения, является ли это пользовательское исключение или предопределенное. Это просто не работает. Если у вас есть возможность взглянуть на исходный код MVC для класса ModelError , вы увидите, что у него есть открытое строковое свойство ErrorMessage , которое используется для отображения ошибки при проверке ( в ValidationExtensions класс).

В конструкторе перегрузки ModelError (Исключение исключения) , однако, он просто устанавливает свойство ErrorMessage как пустую строку, а не exception.Message . Вот почему вы ничего не видите.

...