在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", "Shared"); // 已有的错误控制器
        routeData.Values.Add("Action", "Error"); // 自定义的错误页面         Server.ClearError();
        SharedController controller = new SharedController(); // 自定义错误页面控制器
        string errController = Request.RequestContext.RouteData.Values["Controller"].ToString();
        string errAction = Request.RequestContext.RouteData.Values["Action"].ToString();
        HandleErrorInfo handleErrorInfo = new HandleErrorInfo(ex, errController, errAction);
        controller.ViewData.Model = handleErrorInfo; //传错误信息
        RequestContext requestContext = new RequestContext(new HttpContextWrapper(Context), routeData); // 封装与已定义路由匹配的HTTP请求的信息
        ((IController)controller).Execute(requestContext); //执行上下文请求
        Response.End();
}
}

其中方案二的对象用法,与默认的错误页(即 /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();
}

相关配置影响:

<!--开启会导致异常不走Application_Error,直接寻Error-->
<!--<customErrors mode="On" defaultRedirect="~/Error.cshtml" />-->

C# MVC 全局错误Application_Error中处理(包括Ajax请求)的更多相关文章

  1. 想抛就抛:Application_Error中统一处理ajax请求执行中抛出的异常

    女朋友不是想抛就抛,但异常却可以,不信请往下看. 今天在MVC Controller中写代码时,纠结了一下: public async Task<ActionResult> Save(in ...

  2. 使用NSURLProtocol和NSURLSession拦截UIWebView的HTTP请求(包括ajax请求)

    问题:服务器端有一个网站需要AD认证,整站都开了Basic认证,包括图片,CSS等资源,我在HTTP请求头里面添加认证所需的用户名和密码,传递到服务器端可以认证通过.我在UIWebView的shoul ...

  3. ASP.NET MVC 使 Controller 的 Action 只接受 Ajax 请求。

    首先,ajax 请求跟一般的 web 请求本质是相同的,都是 http 请求.理论上服务器端是无法区分该次请求是不是 ajax 请求的,但是,既然标题都已经说了,那么肯定是有办法做的. 在 ajax ...

  4. jQuery实现的分页功能,包括ajax请求,后台数据,有完整demo

    一:需求分析 1)需要首页,末页功能 2)有点击查看上一页,下一页功能 3)页码到当前可视页码最后一页刷新页面 二:功能实现思路 也是分为三部分处理 1)点击首页,末页直接显示第一页或者最后一页内容, ...

  5. SpringBoot自定义错误信息,SpringBoot适配Ajax请求

    SpringBoot自定义错误信息,SpringBoot自定义异常处理类, SpringBoot异常结果处理适配页面及Ajax请求, SpringBoot适配Ajax请求 ============== ...

  6. 在springmvc框架中,通过ajax请求,响应至前端的中文显示是?

    今天遇到的一个问题,我通过ajax请求去访问控制器,然后通过控制器给我响应了一段json数据,但是里面的中文 在浏览上显示是??,我在web.xml 文件中是设置了编码过滤器的,但是估计这个编码过滤器 ...

  7. asp.net mvc全局错误处理

    方式一:全局捕获异常 根据错误编码直接跳转到对应静态页面 1,在Global.asax.cs文件中添加错误处理方法Application_Error 代码如下 protected void Appli ...

  8. abort终止正在进行中的的ajax请求

    核心:调用XMLHttpRequest对象上的abort方法 jQuery的ajax方法有自己的超时时间设置参数:   $.ajax({type:'POST', url:'b.php', data:' ...

  9. servlet中如何发送ajax请求并动态拼接数据到html中

    废话不多说,直接上代码 1.servlet 2.js 3.jsp 有不懂得欢迎来扣我哦^_^ 详细介绍请查看全文:https://cnblogs.com/qianzf/ 原文博客的链接地址:https ...

随机推荐

  1. 安卓开发实战-记账本APP(四)

    今天实现的内容有:添加账本信息,个人头像的切换,密码的修改,退出登录. 添加账本信息有三个功能: ①记一笔支出项目 ②记一笔收入项目 ③清空所有项目 在此期间遇到的困难有:Activity与Fragm ...

  2. 通过域名直接访问Linux服务器中的项目

    参考:https://blog.csdn.net/m0_37802616/article/details/87623077 https://blog.csdn.net/u013176571/artic ...

  3. 有道词典 Andriod 版本数据格式分析

    其实很简单无聊 基于版本 5.3 分析. 其实也简单分析了有道词典iOS版本,必应词典的各个版本,以及金山词典的各个版本,还有那个一直逍遥法外的林格斯词典. 由于在各个平台上的限制,同一词典的不同版本 ...

  4. Java实现多线程下载,支持断点续传

    完整代码:https://github.com/iyuanyb/Downloader 多线程下载及断点续传的实现是使用 HTTP/1.1 引入的 Range 请求参数,可以访问Web资源的指定区间的内 ...

  5. HDU_5456_数位dp

    http://acm.hdu.edu.cn/showproblem.php?pid=5456 转化成a=b+c,dp[i][a][b][c]表示剩余i木棒,a是否有进位,b是否首尾,c是否首位,注意每 ...

  6. Window下,Jenkins忘记密码解决方法

    没有修改过密码的情况下找回初始密码(或者第一次部署的时候) 进入目录 D:\jenkins\secrets ,找到文件 initialAdminPassword 在jenkins页面,输入登录名adm ...

  7. Java:枚举类也就这么回事

    目录 一.前言 二.源自一道面试题 三.枚举的由来 四.枚举的定义形式 五.Enum类里有啥? 1.唯一的构造器 2.重要的方法们 3.凭空出现的values()方法 六.反编译枚举类 七.枚举类实现 ...

  8. ELF文件之八——使用链接脚本-2个函数-data-bss-temp-call-debug信息

    gcc编译选项可以设置生成调试信息, debug信息格式有stabs,coff,xcoff,dwarf. 常用的有两种格式,stab和dwarf,stab较早,dwarf较新.两种格式介绍:https ...

  9. linux 下生成随机密码生成器

    [root@localhost ~]# yum -y install pwgen [root@localhost ~]# pwgen -ncCyB1 8 1 kei%b3Xa [root@localh ...

  10. 我说我了解集合类,面试官竟然问我为啥HashMap的负载因子不设置成1!?

    在Java基础中,集合类是很关键的一块知识点,也是日常开发的时候经常会用到的.比如List.Map这些在代码中也是很常见的. 个人认为,关于HashMap的实现,JDK的工程师其实是做了很多优化的,要 ...