我有一个自定义异常类:
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 处理自定义异常呢?使用第二个重载是否正确?