jquery ajax가 작업을 호출 할 때 컨트롤러에서 throw되는 예외를 어떻게 처리합니까?
예를 들어, 디버그 모드에서 예외 메시지를 표시하거나 정상적인 오류 메시지 만 표시하는 ajax 호출 중에 모든 종류의 서버 예외에서 실행되는 전역 자바 스크립트 코드를 원합니다.
클라이언트 측에서는 ajax 오류에 대한 함수를 호출합니다.
서버 측에서 사용자 지정 작업 필터를 작성해야합니까?
jquery ajax가 작업을 호출 할 때 컨트롤러에서 throw되는 예외를 어떻게 처리합니까?
예를 들어, 디버그 모드에서 예외 메시지를 표시하거나 정상적인 오류 메시지 만 표시하는 ajax 호출 중에 모든 종류의 서버 예외에서 실행되는 전역 자바 스크립트 코드를 원합니다.
클라이언트 측에서는 ajax 오류에 대한 함수를 호출합니다.
서버 측에서 사용자 지정 작업 필터를 작성해야합니까?
답변:
서버가 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
}
});
error
콜백이 실행됩니다.
인터넷 검색 후 MVC Action Filter를 기반으로 간단한 예외 처리를 작성합니다.
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.ascx에 작성하십시오.
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>
마지막으로 사용자 지정 오류를 켜야합니다. 그리고 그것을 즐기십시오 :)
불행히도 어떤 답변도 나에게 좋지 않습니다. 놀랍게도 솔루션은 훨씬 간단합니다. 컨트롤러에서 반환 :
return new HttpStatusCodeResult(HttpStatusCode.BadRequest, e.Response.ReasonPhrase);
그리고 원하는대로 클라이언트에서 표준 HTTP 오류로 처리하십시오.
int
. 또한 이렇게하면 결과가 ajax
success
핸들러가 아닌 핸들러에 전달됩니다 error
. 이것이 예상 된 동작입니까?
나는 시간이 부족하고 잘 작동했기 때문에 빠른 해결책을 찾았습니다. 더 나은 옵션은 예외 필터를 사용하는 것이라고 생각하지만 간단한 솔루션이 필요한 경우 내 솔루션이 도움이 될 수 있습니다.
나는 다음을했다. 컨트롤러 메서드에서 Data 내부에 "Success"속성이있는 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 호출에서 예외가 있는지 알기 위해이 속성을 요청했습니다.
$.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.')
}
});
도움이 되었기를 바랍니다. 해피 코드! :피
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.
}
});
이것이 다른 사람에게 도움이되기를 바랍니다!
클라이언트 측에서 ajax 호출의 오류를 처리하기 error
위해 ajax 호출 옵션에 함수를 할당합니다 .
기본값을 전역으로 설정하려면 http://api.jquery.com/jQuery.ajaxSetup에 설명 된 함수를 사용할 수 있습니다 .