복붙노트

[JQUERY] ASP.NET MVC 아약스 오류 처리

JQUERY

ASP.NET MVC 아약스 오류 처리

해결법


  1. 1.서버가 200 이상의 일부 상태 코드를 다른를 보내는 경우, 오류 콜백이 실행됩니다

    서버가 200 이상의 일부 상태 코드를 다른를 보내는 경우, 오류 콜백이 실행됩니다

    $.ajax({
        url: '/foo',
        success: function(result) {
            alert('yeap');
        },
        error: function(XMLHttpRequest, textStatus, errorThrown) {
            alert('oops, something bad happened');
        }
    });
    

    그리고 당신은 $ .ajaxSetup () 메소드를 사용할 수있는 전역 오류 핸들러를 등록합니다 :

    $.ajaxSetup({
        error: function(XMLHttpRequest, textStatus, errorThrown) {
            alert('oops, something bad happened');
        }
    });
    

    또 다른 방법은 JSON을 사용하는 것입니다. 당신은 예외 JSON 응답으로 변환을 잡는다 서버에서 사용자 지정 작업 필터를 작성할 수 있도록 :

    public class MyErrorHandlerAttribute : FilterAttribute, IExceptionFilter
    {
        public void OnException(ExceptionContext filterContext)
        {
            filterContext.ExceptionHandled = true;
            filterContext.Result = new JsonResult
            {
                Data = new { success = false, error = filterContext.Exception.ToString() },
                JsonRequestBehavior = JsonRequestBehavior.AllowGet
            };
        }
    }
    

    다음이 속성을 가진 컨트롤러 액션을 장식 :

    [MyErrorHandler]
    public ActionResult Foo(string id)
    {
        if (string.IsNullOrEmpty(id))
        {
            throw new Exception("oh no");
        }
        return Json(new { success = true });
    }
    

    그리고 마지막으로 그것을 호출 :

    $.getJSON('/home/foo', { id: null }, function (result) {
        if (!result.success) {
            alert(result.error);
        } else {
            // handle the success
        }
    });
    

  2. 2.인터넷 검색 후 나는 MVC 액션 필터를 기반으로 처리하는 간단한 예외 쓰기

    인터넷 검색 후 나는 MVC 액션 필터를 기반으로 처리하는 간단한 예외 쓰기

    public class HandleExceptionAttribute : HandleErrorAttribute
    {
        public override void OnException(ExceptionContext filterContext)
        {
            if (filterContext.HttpContext.Request.IsAjaxRequest() && filterContext.Exception != null)
            {
                filterContext.HttpContext.Response.StatusCode = (int)HttpStatusCode.InternalServerError;
                filterContext.Result = new JsonResult
                {
                    JsonRequestBehavior = JsonRequestBehavior.AllowGet,
                    Data = new
                    {
                        filterContext.Exception.Message,
                        filterContext.Exception.StackTrace
                    }
                };
                filterContext.ExceptionHandled = true;
            }
            else
            {
                base.OnException(filterContext);
            }
        }
    }
    

    과의 Global.asax에 쓰기 :

     public static void RegisterGlobalFilters(GlobalFilterCollection filters)
     {
          filters.Add(new HandleExceptionAttribute());
     }
    

    다음 레이아웃 또는 마스터 페이지에서이 스크립트를 작성 :

    <script type="text/javascript">
          $(document).ajaxError(function (e, jqxhr, settings, exception) {
                           e.stopPropagation();
                           if (jqxhr != null)
                               alert(jqxhr.responseText);
                         });
    </script>
    

    마지막으로 사용자 정의 오류를 설정해야합니다. 그리고 그것을 즐길 :)


  3. 3.불행하게도, 어느 쪽도 아니 대답은 나를 위해 좋은 없습니다. 놀랍게도이 솔루션은 매우 간단합니다. 컨트롤러에서 돌아 가기 :

    불행하게도, 어느 쪽도 아니 대답은 나를 위해 좋은 없습니다. 놀랍게도이 솔루션은 매우 간단합니다. 컨트롤러에서 돌아 가기 :

    return new HttpStatusCodeResult(HttpStatusCode.BadRequest, e.Response.ReasonPhrase);
    

    당신이 원하는대로 그리고 클라이언트에서 표준 HTTP 오류로 처리합니다.


  4. 4.나는 짧은 시간이었고, 그것이 확인 일 때문에 빠른 솔루션을했다. 나는 더 나은 옵션은 예외 필터를 사용하여 생각하지만, 어쩌면 내 솔루션은 간단한 솔루션이 필요하다는 것을 경우에 도움이 될 수 있습니다.

    나는 짧은 시간이었고, 그것이 확인 일 때문에 빠른 솔루션을했다. 나는 더 나은 옵션은 예외 필터를 사용하여 생각하지만, 어쩌면 내 솔루션은 간단한 솔루션이 필요하다는 것을 경우에 도움이 될 수 있습니다.

    나는 다음을했다. 컨트롤러 방법에서 나는 데이터 내부 속성 "성공"으로 JsonResult을 반환

        [HttpPut]
        public JsonResult UpdateEmployeeConfig(EmployeConfig employeToSave) 
        {
            if (!ModelState.IsValid)
            {
                return new JsonResult
                {
                    Data = new { ErrorMessage = "Model is not valid", Success = false },
                    ContentEncoding = System.Text.Encoding.UTF8,
                    JsonRequestBehavior = JsonRequestBehavior.DenyGet
                };
            }
            try
            {
                MyDbContext db = new MyDbContext();
    
                db.Entry(employeToSave).State = EntityState.Modified;
                db.SaveChanges();
    
                DTO.EmployeConfig user = (DTO.EmployeConfig)Session["EmployeLoggin"];
    
                if (employeToSave.Id == user.Id)
                {
                    user.Company = employeToSave.Company;
                    user.Language = employeToSave.Language;
                    user.Money = employeToSave.Money;
                    user.CostCenter = employeToSave.CostCenter;
    
                    Session["EmployeLoggin"] = user;
                }
            }
            catch (Exception ex) 
            {
                return new JsonResult
                {
                    Data = new { ErrorMessage = ex.Message, Success = false },
                    ContentEncoding = System.Text.Encoding.UTF8,
                    JsonRequestBehavior = JsonRequestBehavior.DenyGet
                };
            }
    
            return new JsonResult() { Data = new { Success = true }, };
        }
    

    이후 아약스 호출 난 그냥 예외를 가지고 있는지 알고이 부동산에 대한 질문 :

    $.ajax({
        url: 'UpdateEmployeeConfig',
        type: 'PUT',
        data: JSON.stringify(EmployeConfig),
        contentType: "application/json;charset=utf-8",
        success: function (data) {
            if (data.Success) {
                //This is for the example. Please do something prettier for the user, :)
                alert('All was really ok');                                           
            }
            else {
                alert('Oups.. we had errors: ' + data.ErrorMessage);
            }
        },
        error: function (request, status, error) {
           alert('oh, errors here. The call to the server is not working.')
        }
    });
    

    도움이 되었기를 바랍니다. 해피 코드! :피


  5. 5.aleho의 반응과 일치 여기에 완벽한 예입니다. 그것은 마법처럼 작동하고 매우 간단합니다.

    aleho의 반응과 일치 여기에 완벽한 예입니다. 그것은 마법처럼 작동하고 매우 간단합니다.

    컨트롤러 코드

    [HttpGet]
    public async Task<ActionResult> ChildItems()
    {
        var client = TranslationDataHttpClient.GetClient();
        HttpResponseMessage response = await client.GetAsync("childItems);
    
        if (response.IsSuccessStatusCode)
            {
                string content = response.Content.ReadAsStringAsync().Result;
                List<WorkflowItem> parameters = JsonConvert.DeserializeObject<List<WorkflowItem>>(content);
                return Json(content, JsonRequestBehavior.AllowGet);
            }
            else
            {
                return new HttpStatusCodeResult(response.StatusCode, response.ReasonPhrase);
            }
        }
    }
    

    뷰에서 자바 스크립트 코드

    var url = '@Html.Raw(@Url.Action("ChildItems", "WorkflowItemModal")';
    
    $.ajax({
        type: "GET",
        dataType: "json",
        url: url,
        contentType: "application/json; charset=utf-8",
        success: function (data) {
            // Do something with the returned data
        },
        error: function (xhr, status, error) {
            // Handle the error.
        }
    });
    

    이 다른 사람을 도움이되기를 바랍니다!


  6. 6.클라이언트 측에서 아약스 호출에서 오류를 처리하기 위해, 당신은 아약스 호출의 오류 옵션에 기능을 할당 할 수 있습니다.

    클라이언트 측에서 아약스 호출에서 오류를 처리하기 위해, 당신은 아약스 호출의 오류 옵션에 기능을 할당 할 수 있습니다.

    이 기능은 여기에 설명 사용할 수있는, 세계적으로 디폴트를 설정하려면 : http://api.jquery.com/jQuery.ajaxSetup.

  7. from https://stackoverflow.com/questions/4707755/asp-net-mvc-ajax-error-handling by cc-by-sa and MIT license