【问题标题】:How to return exception data in json format from App_Error in global.asax?如何从 global.asax 中的 App_Error 返回 json 格式的异常数据?
【发布时间】:2012-10-29 11:55:29
【问题描述】:

我正在将 Asp.net MVC 项目作为单页应用程序进行错误处理。
我想将 json 数据从 global.asax 中的 Application_Error 方法返回到 UI 并通过 jQuery 显示或调用控制器并返回部分视图。
我不想刷新页面或将其重定向到错误页面。

【问题讨论】:

标签: json asp.net-mvc global-asax


【解决方案1】:

这是要走的路

protected void Application_Error(object sender, EventArgs e)
{
    Exception exception = Server.GetLastError();

    // if the error is NOT http error, then stop handling it.
    if (!(exception is HttpException httpException))
        return;

    if (new HttpRequestWrapper(Request).IsAjaxRequest())
    {
        Response.Clear();
        Response.TrySkipIisCustomErrors = true;
        Server.ClearError();

        Response.ContentType = "application/json";
        Response.StatusCode = 400;
        JsonResult json = new JsonResult
        {
            Data = exception.Message
        };

        json.ExecuteResult(new ControllerContext(Request.RequestContext, new BaseController()));
    }
}

【讨论】:

    【解决方案2】:
    //Write This code into your global.asax file
    
        protected void Application_Error(Object sender, EventArgs e)
                {
                var ex = Server.GetLastError();
                    //We check if we have an AJAX request and return JSON in this case
                    if (IsAjaxRequest())
                    {
                        Response.Write(JsonConvert.SerializeObject(new
                                {
                                    error = true,
                                    message = "Exception: " + ex.Message
                                })
                            );
                    }
                }
    
    
                private bool IsAjaxRequest()
                {
                    //The easy way
                    bool isAjaxRequest = (Request["X-Requested-With"] == "XMLHttpRequest")
                    || ((Request.Headers != null)
                    && (Request.Headers["X-Requested-With"] == "XMLHttpRequest"));
    
                    //If we are not sure that we have an AJAX request or that we have to return JSON 
                    //we fall back to Reflection
                    if (!isAjaxRequest)
                    {
                        try
                        {
                            //The controller and action
                            string controllerName = Request.RequestContext.
                                                    RouteData.Values["controller"].ToString();
                            string actionName = Request.RequestContext.
                                                RouteData.Values["action"].ToString();
    
                            //We create a controller instance
                            DefaultControllerFactory controllerFactory = new DefaultControllerFactory();
                            Controller controller = controllerFactory.CreateController(
                            Request.RequestContext, controllerName) as Controller;
    
                            //We get the controller actions
                            ReflectedControllerDescriptor controllerDescriptor =
                            new ReflectedControllerDescriptor(controller.GetType());
                            ActionDescriptor[] controllerActions =
                            controllerDescriptor.GetCanonicalActions();
    
                            //We search for our action
                            foreach (ReflectedActionDescriptor actionDescriptor in controllerActions)
                            {
                                if (actionDescriptor.ActionName.ToUpper().Equals(actionName.ToUpper()))
                                {
                                    //If the action returns JsonResult then we have an AJAX request
                                    if (actionDescriptor.MethodInfo.ReturnType
                                    .Equals(typeof(JsonResult)))
                                        return true;
                                }
                            }
                        }
                        catch
                        {
    
                        }
                    }
    
                    return isAjaxRequest;
                }
    
    
    //Write this code in your ajax function in html file
    
    <script type="text/javascript">
    
    
        $.ajax({
                url: Url
                type: 'POST',
                data: JSON.stringify(json_data),
                dataType: 'json',
                cache: false,
                contentType: 'application/json',
                success: function (data) { Successfunction(data); },
                error: function (xhr, ajaxOptions, thrownError) {
                    var obj = JSON.parse(xhr.responseText);
                    if (obj.error) {
                        show_errorMsg(obj.message);
                    }
                }
            });
    
    </script>
    

    【讨论】:

      猜你喜欢
      • 2016-09-08
      • 1970-01-01
      • 2011-08-17
      • 1970-01-01
      • 1970-01-01
      • 2021-10-08
      • 2020-02-07
      • 2022-10-20
      • 1970-01-01
      相关资源
      最近更新 更多