2

我有一个自定义异常类:

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

4

1 回答 1

6

不管是自定义异常还是预定义异常。它只是行不通。如果您有机会查看ModelError类的 MVC 源代码,您可以看到它有一个公共字符串属性ErrorMessage,用于在验证发生时显示错误(在ValidationExtensions类中)。

但是,在ModelError(Exception exception)的重载构造函数中,它只是将ErrorMessage属性设置为空字符串,而不是exception.Message。这就是为什么你什么也看不见。

于 2010-10-27T03:10:16.983 回答