具有自定义异常的ASP.NET MVC 2模型错误

时间:2010-10-27 01:31:59

标签: c# asp.net-mvc-2 modelstate asp.net-mvc-2-validation custom-exceptions

我有一个自定义异常类:

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

.ToDescriptionMyExceptionEnum上的扩展方法,用于为异常错误详细信息提供枚举到字符串映射。

以下是我扔它的方式:

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

所以我使用我的第一个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);
}

最后是视图中的一个片段:

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

不起作用(我调试时抛出异常,错误被添加到模型状态,但页面上没有显示任何内容)。

但如果我改为以下一行:

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

有效。

AddModelError有两个重载:

  1. string,Exception(对我不起作用)
  2. string,string(works)
  3. 第一次过载有什么用?我的异常确实有一条内部异常消息,所以我认为HTML扩展会呈现这个消息吗?

    我们如何使用ModelState处理自定义异常呢?使用第二次过载是否正确?

1 个答案:

答案 0 :(得分:5)

无论是自定义异常还是预定义异常都无关紧要。它只是不起作用。 如果您有机会查看 ModelError 类的MVC源代码,您可以看到它具有公共字符串属性 ErrorMessage ,用于在验证时显示错误发生(在 ValidationExtensions 类中)。

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