2

カスタム例外クラスがあります:

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 を使用して、特定のメッセージで新しい例外を作成します。

次にコントローラに:

[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には 2 つのオーバーロードがあります。

  1. 文字列、例外 (私には機能しません)
  2. 文字列、文字列 (作品)

それでは、最初のオーバーロードの使用は何ですか? 私の例外には内部例外メッセージがあるので、HTML 拡張機能がそれをレンダリングすると思っていたでしょうか?

では、ModelState でカスタム例外をどのように処理すればよいでしょうか? 2 番目のオーバーロードの使用は正しいですか?

4

1 に答える 1

6

カスタム例外か事前定義された例外かは関係ありません。うまくいきません。ModelErrorクラスの MVC ソース コードを見る機会があれば、 ( ValidationExtensionsクラスで) 検証が発生したときにエラーを表示するために使用されるパブリック文字列プロパティErrorMessageがあることがわかります。

ただし、 ModelError(Exception exception)のオーバーロード コンストラクターでは、 ErrorMessageプロパティをexception.Messageではなく空の文字列として設定するだけです。それがあなたが何も見えない理由です。

于 2010-10-27T03:10:16.983 に答える