在Asp.Net Mvc的Application_Error事件中,返回View

为了满足的我恶趣味,Asp.Net自带的错误页面已经满足不了我的需求了,我需要在发生错误时去显示自定义错误页,比如:

ThinkPHP的那个错误页面真是深得我心,就像这样:

我把放在了Message下的Error页面,嗯……偷过来的:

然后,错误页面理所当然的变成了酱紫:

Message.Error控制器:

/// <summary>
/// 显示错误页面
/// </summary>
/// <param name="msg">要显示的提示</param>
/// <param name="jump">显示错误后跳转到哪里</param>
/// <returns></returns>
public ActionResult Error(string msg, string jump)
{
	if (ControllerContext.RouteData.Values["ViewData"] != null)
		ViewData = ControllerContext.RouteData.Values["ViewData"] as ViewDataDictionary;
	else
	{
		ViewData.Add("Message", msg);
		ViewData.Add("Jump", jump);
	}
	return View();
}

Message.Error视图代码:

@{
    ViewBag.Title = "Error";
}
<!DOCTYPE HTML PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
    <title>跳转提示</title>
    <style type="text/css">
        * {
            padding: 0;
            margin: 0;
        }

        body {
            background: #fff;
            font-family: '微软雅黑';
            color: #333;
            font-size: 16px;
        }

        .system-message {
            padding: 24px 48px;
        }
        .system-message h1 {
            font-size: 100px;
            font-weight: normal;
            line-height: 120px;
            margin-bottom: 12px;
        }
        .system-message .jump {
            padding-top: 10px;
        }

        .system-message .jump a {
            color: #333;
        }

        .system-message .success, .system-message .error {
            line-height: 1.8em;
            font-size: 36px;
        }

        .system-message .detail {
            font-size: 12px;
            line-height: 20px;
            margin-top: 12px;
            display: none;
        }
    </style>
</head>
<body>
    <div class="system-message">
        <h1>:(</h1>
        <p class="error">@ViewData["Message"].ToString()</p><p class="detail"></p>
        <p class="jump">
            页面自动 <a id="href" href="@ViewData["Jump"].ToString()">跳转</a> 等待时间: <b id="wait">3</b>
            [ <a href="#">寻找帮助</a> ]
        </p>
    </div>
    <script type="text/javascript">
        (function () {
            var wait = document.getElementById('wait'), href = document.getElementById('href').href;
            var interval = setInterval(function () {
                var time = --wait.innerHTML;
                if (time === 0) {
                    location.href = href;
                    clearInterval(interval);
                };
            }, 1000);
        })();
    </script>
</body>
</html>

嗯。。。Application_Error事件内代码:

protected void Application_Error(object sender, EventArgs e)
{
	var error = Server.GetLastError();
	var code = (error is HttpException) ? (error as HttpException).GetHttpCode() : 500;
	var context = ((HttpApplication)sender).Context;
	Response.Clear();
	Server.ClearError();

	if (code == 404)
	{
		 //404
		 var routeData = new RouteData();
		 routeData.Values["controller"] = "Message";
		 routeData.Values["action"] = "Error";
		 var viewData = new ViewDataDictionary { { "Message", error.Message }, { "Jump", "/Main/Index" } };
		 routeData.Values["ViewData"] = viewData;

		 var contextWrapper = new HttpContextWrapper(this.Context);
		 IController errorsController = new MessageController();
		 var requestContext = new RequestContext(contextWrapper, routeData);
		 
		 errorsController.Execute(requestContext);
		 Response.End();
	}
}

页面是ThinkPHP的默认错误页

参考资料:Revisiting MVC Custom Error Handling

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注

此站点使用Akismet来减少垃圾评论。了解我们如何处理您的评论数据