Error message here!

Hide Error message here!

忘记密码?

Error message here!

请输入正确邮箱

Hide Error message here!

密码丢失?请输入您的电子邮件地址。您将收到一个重设密码链接。

Error message here!

返回登录

Close

C# MVC 全局错误Application_Error中处理(包括Ajax请求)

淋风淼淼 2020-01-09 15:02:00 阅读数:35 评论数:0 点赞数:0 收藏数:0

在MVC的Global.asax Application_Error 中处理全局错误。

如果在未到创建请求对象时报错,此时 Context.Handler == null

判断为Ajax请求时,我们返回Json对象字符串。不是Ajax请求时,转到错误显示页面。

/// <summary>
/// 全局错误
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
protected void Application_Error(object sender, EventArgs e)
{
Exception ex = Server.GetLastError();
LogHelper.Error(ex); // 记录错误日志(NLog 挺好用的(* ̄︶ ̄))
if (Context.Handler == null)
{
return;
}
if (new HttpRequestWrapper(Request).IsAjaxRequest())
{
Response.Clear();
Response.ContentType = "application/json; charset=utf-8";
Response.Write("{\"state\":\"0\",\"msg\":\"" + ex.Message + "\"}");
Response.Flush();
Response.End();
}
else
{
// 方案一 重定向到错误页面,带上简单的错误信息
//string errurl = "/Error/Error?msg=" + ex.Message;
//Response.Redirect(errurl, true);
// 方案二 带上错误对象,转到错误页
 Response.Clear();
RouteData routeData = new RouteData();
routeData.Values.Add("Controller", "Error"); // 已有的错误控制器
routeData.Values.Add("Action", "Error"); // 自定义的错误页面

Server.ClearError();
ErrorController controller = new ErrorController();
HandleErrorInfo handleErrorInfo = new HandleErrorInfo(ex, "Error", "Error");
controller.ViewData.Model = handleErrorInfo;
((IController)controller).Execute(new RequestContext(new HttpContextWrapper(((MvcApplication)sender).Context), routeData));
}
}

其中方案二的对象用法,与默认的错误页(即 /Shared/Error.cshtml)一样。当我们不对错误进行任何处理时,在web.config中可配置错误页到 /Shared/Error.cshtml。

Error.cshtml的代码:

@model System.Web.Mvc.HandleErrorInfo
@{
ViewBag.Title = "系统错误";
Layout = "~/Views/Shared/_Layout.cshtml";
}
<h3 class="text-danger">系统错误</h3>
@if (Model != null)
{
<span class="text-warning">@(Model.Exception.Message)</span>
}
else
{
<span class="text-warning">处理请求时出错。</span>
}

方案二的Action的代码:

public ActionResult Error()
{
return View();
}
版权声明
本文为[淋风淼淼]所创,转载请带上原文链接,感谢
https://www.cnblogs.com/miaolin/p/12171569.html