[解決済み] ASP.NET MVCでError.cshtmlはどのように呼び出されるのですか?
2023-07-03 09:19:10
質問
StackOverflowで似たような質問を何度も読みましたが、どうしても理解できません。 web.config のカスタム エラー ノードと HandleErrorAttribute に関して、Error.cshtml はどのように呼び出されるのでしょうか。 最終的には、この質問に対する答えは、ASP.NET MVCのエラー処理に関して既にあるいくつかの質問のうちの1つに対する答えになるのかもしれません。 しかし、実際のところ、私はどれがそうなのかわかりません。
どのように解決するのですか?
Global.asaxの中に、以下のメソッドがあります。
public static void RegisterGlobalFilters(GlobalFilterCollection filters)
{
filters.Add(new HandleErrorAttribute());
}
これは、HandleErrorAttributeをグローバルアクションフィルタとして登録します。これは、このハンドラがすべてのコントローラアクションに自動的に適用されることを意味します。では、この属性がどのように実装されているのか、ソースコードを見てみましょう。
[SuppressMessage("Microsoft.Performance", "CA1813:AvoidUnsealedAttributes", Justification = "This attribute is AllowMultiple = true and users might want to override behavior.")]
[AttributeUsage(AttributeTargets.Class | AttributeTargets.Method, Inherited = true, AllowMultiple = true)]
public class HandleErrorAttribute : FilterAttribute, IExceptionFilter {
private const string _defaultView = "Error";
private readonly object _typeId = new object();
private Type _exceptionType = typeof(Exception);
private string _master;
private string _view;
public Type ExceptionType {
get {
return _exceptionType;
}
set {
if (value == null) {
throw new ArgumentNullException("value");
}
if (!typeof(Exception).IsAssignableFrom(value)) {
throw new ArgumentException(String.Format(CultureInfo.CurrentCulture,
MvcResources.ExceptionViewAttribute_NonExceptionType, value.FullName));
}
_exceptionType = value;
}
}
public string Master {
get {
return _master ?? String.Empty;
}
set {
_master = value;
}
}
public override object TypeId {
get {
return _typeId;
}
}
public string View {
get {
return (!String.IsNullOrEmpty(_view)) ? _view : _defaultView;
}
set {
_view = value;
}
}
public virtual void OnException(ExceptionContext filterContext) {
if (filterContext == null) {
throw new ArgumentNullException("filterContext");
}
if (filterContext.IsChildAction) {
return;
}
// If custom errors are disabled, we need to let the normal ASP.NET exception handler
// execute so that the user can see useful debugging information.
if (filterContext.ExceptionHandled || !filterContext.HttpContext.IsCustomErrorEnabled) {
return;
}
Exception exception = filterContext.Exception;
// If this is not an HTTP 500 (for example, if somebody throws an HTTP 404 from an action method),
// ignore it.
if (new HttpException(null, exception).GetHttpCode() != 500) {
return;
}
if (!ExceptionType.IsInstanceOfType(exception)) {
return;
}
string controllerName = (string)filterContext.RouteData.Values["controller"];
string actionName = (string)filterContext.RouteData.Values["action"];
HandleErrorInfo model = new HandleErrorInfo(filterContext.Exception, controllerName, actionName);
filterContext.Result = new ViewResult {
ViewName = View,
MasterName = Master,
ViewData = new ViewDataDictionary<HandleErrorInfo>(model),
TempData = filterContext.Controller.TempData
};
filterContext.ExceptionHandled = true;
filterContext.HttpContext.Response.Clear();
filterContext.HttpContext.Response.StatusCode = 500;
// Certain versions of IIS will sometimes use their own error page when
// they detect a server error. Setting this property indicates that we
// want it to try to render ASP.NET MVC's error page instead.
filterContext.HttpContext.Response.TrySkipIisCustomErrors = true;
}
}
ソースコードにはコメントが含まれており、説明するまでもありません。最初にチェックされるのは、web.config でカスタムエラーが有効になっているかどうかです (すなわち
<customErrors mode="On">
). もしそうでなければ、何もしません => YSOD。カスタムエラーが有効になっている場合、例外のスタックトレースやその他の有用な情報を含むモデルを渡して、エラー ビューをレンダリングします。
関連
-
[解決済み] Html.DisplayForの構文は何のためにあるのですか?
-
[解決済み] 年、月、日のパラメーターは、表現できない DateTime Exception を記述します。
-
[解決済み] ファイルアップロード ASP.NET MVC 3.0
-
[解決済み】ASP.NET MVCでファイルを表示/ダウンロードに戻す場合
-
[解決済み] razorを使ったDateTimeフォーマットの変換
-
[解決済み] null可能なブーリアンに対するチェックボックス
-
[解決済み] Razor は閉じていない html タグを理解しません。
-
[解決済み] ASP.NET MVC 3でJSON.NETをデフォルトのJSONシリアライザーとして使用する - それは可能か?
-
[解決済み] System.Web.Mvc.Html.MvcForm をページに表示する。
-
[解決済み] ASP MVC 3で1つのビューに2つのモデル
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み] Html.DisplayForの構文は何のためにあるのですか?
-
[解決済み】MVC 3 web.configのwebpages:Enabledの機能は何ですか?
-
[解決済み] Razor のページに @using 宣言の代わりに余分な名前空間を追加する方法は?
-
[解決済み] ビュー内の現在のコントローラを取得する
-
[解決済み] razorを使ったDateTimeフォーマットの変換
-
[解決済み] ASP.NET MVC 3でJSON.NETをデフォルトのJSONシリアライザーとして使用する - それは可能か?
-
[解決済み] ASP.NET MVC3:packages.configは何のためにあるのですか?
-
[解決済み] System.Web.Mvc.Html.MvcForm をページに表示する。
-
[解決済み] Razor If/Else 条件演算子のシンタックス [重複]。
-
[解決済み] mvc3のrazorでLabelForの表示名を変更する方法は?