У меня есть класс исключений:
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
имеет две перегрузки:
- строка, исключение (у меня не работает)
- строка, строка (работает)
Какая польза от первой перегрузки тогда? У моего исключения есть внутреннее сообщение об исключении, поэтому я мог бы подумать, что расширение HTML отобразит это?
Как мы тогда обрабатываем пользовательские исключения с ModelState? Правильно ли используется вторая перегрузка?