カスタム例外クラスがあります:
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
には 2 つのオーバーロードがあります。
- 文字列、例外 (私には機能しません)
- 文字列、文字列 (作品)
それでは、最初のオーバーロードの使用は何ですか? 私の例外には内部例外メッセージがあるので、HTML 拡張機能がそれをレンダリングすると思っていたでしょうか?
では、ModelState でカスタム例外をどのように処理すればよいでしょうか? 2 番目のオーバーロードの使用は正しいですか?