推荐的方法来处理我的asp.net mvc 5 Web应用程序中的http错误

时间:2015-03-26 13:08:19

标签: ajax asp.net-mvc asp.net-mvc-4 asp.net-mvc-5

我需要一种方法来全局处理我的asp.net mvc Web应用程序中的http错误。如果对action方法的调用是Ajax,我会执行以下操作: -

$(document).ready(function () {
    $(document).ajaxError(function (e, xhr, textStatus, errorThrown) {
        if (xhr.status == 401)
            window.location = "/Account/Login";
        else if (xhr.status == 403 || xhr.status == 404)
            alert(xhr.statusText, 'Error');

        $(".loadingimage").hide();
    });

我的操作方法如下所示: -

 [CheckUserPermissions(Action = "Edit", Model = "Skill")]
      public async Task<ActionResult> DeleteKBLink(int? skillid,int? linktokbid)
      {
          if (skillid == null || linktokbid==null)
          {
              return new HttpStatusCodeResult(HttpStatusCode.BadRequest);
          }
      var linktokb=     await unitofwork.SkillRepository.FindLinkToKB(linktokbid.Value);
      if (linktokb == null)
              {
                  return new HttpStatusCodeResult(404, "The link has already been deleted.");
              }

但我不知道在请求不是ajax的情况下如何处理http错误?目前我将被重定向到http not found page .. thnaks

1 个答案:

答案 0 :(得分:4)

这个解决方案适合我......

[1]:删除所有'customErrors'和&amp;来自Web.config的“httpErrors”

[2]:检查'App_Start / FilterConfig.cs'如下:

public class FilterConfig
{
    public static void RegisterGlobalFilters(GlobalFilterCollection filters)
    {
        filters.Add(new HandleErrorAttribute());
    }
}

[3]:在'Global.asax'中添加此方法:

public void Application_Error(Object sender, EventArgs e)
{
    Exception exception = Server.GetLastError();
    Server.ClearError();

    var routeData = new RouteData();
    routeData.Values.Add("controller", "ErrorPage");
    routeData.Values.Add("action", "Error");
    routeData.Values.Add("exception", exception);

    if (exception.GetType() == typeof(HttpException))
    {
        routeData.Values.Add("statusCode", ((HttpException)exception).GetHttpCode());
    }
    else
    {
        routeData.Values.Add("statusCode", 500);
    }

    Response.TrySkipIisCustomErrors = true;
    IController controller = new ErrorPageController();
    controller.Execute(new RequestContext(new HttpContextWrapper(Context), routeData));
    Response.End();
}

[4]:添加'Controllers / ErrorPageController.cs'

public class ErrorPageController : Controller
{
    public ActionResult Error(int statusCode, Exception exception)
    {
         Response.StatusCode = statusCode;
         ViewBag.StatusCode = statusCode + " Error";
         return View();
    }
}

[5]:在'Views / Shared / Error.cshtml'

@model System.Web.Mvc.HandleErrorInfo
@{
    ViewBag.Title = (!String.IsNullOrEmpty(ViewBag.StatusCode)) ? ViewBag.StatusCode : "500 Error";
}

<h1 class="error">@(!String.IsNullOrEmpty(ViewBag.StatusCode) ? ViewBag.StatusCode : "500 Error"):</h1>

//@Model.ActionName
//@Model.ContollerName
//@Model.Exception.Message
//@Model.Exception.StackTrace