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

发布于 2024-09-29 01:58:05 字数 1449 浏览 3 评论 0原文

我有一个自定义异常类:

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);

所以我使用我的第一个构造函数,它使用给定的消息创建一个新的异常。

现在进入控制器:

[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 (有效)

那么第一个重载有什么用呢?我的异常确实有一个内部异常消息,所以我会认为 HTML 扩展会呈现它?

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

I have a custom exception class:

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

.ToDescription is a extension method on MyExceptionEnum to provide enum-to-string mapping for the exception error details.

Here's how i throw it:

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

So i use my first ctor, which creates a new Exception with a given message.

Now onto the Controller:

[HttpPost]
public ActionResult UpdateFoo(Foo model)
{
   try
   {
      _fooService.UpdateModel(model);
      _unitOfWork.Commit();
   }
   catch(MyException myException)
   {
      ViewData.ModelState.AddModelError("ModelErrors", myException);
   }

   return View("Index", model);
}

And finally a snippet from the View:

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

Doesn't work (exception is thrown when i debug, error is added to model state, but nothing shown on page).

But if i change to the following line:

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

It works.

AddModelError has two overloads:

  1. string, Exception (doesn't work for me)
  2. string, string (works)

What is the use of the first overload then? My Exception does have an inner exception message, so i would have thought the HTML Extension would render that?

How do we handle custom exceptions with the ModelState then? Is using the second overload correct?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

2024-10-06 01:58:05

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

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

Doesn't matter whether it's a custom exception or pre-defined one. It just doesn't work.
If you have a chance to look at the MVC source code for ModelError class, you can see that it has an public string property ErrorMessage which is used to display the error when validation happens (in ValidationExtensions class).

In the overload constructor of ModelError(Exception exception), though, it just sets the ErrorMessage property as empty string, rather than exception.Message. That's why you see nothing.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文