RPM*_*984 2 c# custom-exceptions modelstate asp.net-mvc-2-validation asp.net-mvc-2
我有一个自定义异常类:
public class MyException: Exception
{
public MyException(MyExceptionEnum myError) : base(myError.ToDescription()) { }
public MyException(MyExceptionEnum myError, Exception innerException) : base(myError.ToDescription(), innerException) { }
}
Run Code Online (Sandbox Code Playgroud)
.ToDescription是一种扩展方法,MyExceptionEnum用于为异常错误详细信息提供枚举到字符串映射.
这是我扔它的方式:
if (someCondition)
throw new MyException(MyExceptionEnum.SomeError);
Run Code Online (Sandbox Code Playgroud)
所以我使用我的第一个ctor,它创建一个带有给定消息的新Exception.
现在进入控制器:
[HttpPost]
public ActionResult UpdateFoo(Foo model)
{
try
{
_fooService.UpdateModel(model);
_unitOfWork.Commit();
}
catch(MyException myException)
{
ViewData.ModelState.AddModelError("ModelErrors", myException);
}
return View("Index", model);
}
Run Code Online (Sandbox Code Playgroud)
最后来自View的片段:
<%: Html.ValidationMessage("ModelErrors") %>
Run Code Online (Sandbox Code Playgroud)
不起作用(我调试时抛出异常,错误被添加到模型状态,但页面上没有显示).
但是,如果我改为以下行:
ViewData.ModelState.AddModelError("ModelErrors", myException.Message);
Run Code Online (Sandbox Code Playgroud)
有用.
AddModelError 有两个重载:
那么第一次过载有什么用呢?我的异常确实有一个内部异常消息,所以我认为HTML扩展会呈现这个?
我们如何使用ModelState处理自定义异常呢?使用第二次过载是否正确?
无论是自定义异常还是预定义异常都无关紧要.它只是不起作用.如果您有机会查看ModelError类的MVC源代码,您可以看到它具有公共字符串属性ErrorMessage,用于在验证发生时显示错误(在ValidationExtensions类中).
但是,在ModelError(异常异常)的重载构造函数中,它只是将ErrorMessage属性设置为空字符串,而不是exception.Message.这就是你什么也看不见的原因.