itsource

ASP에서 null을 반환할 때 jQuery post JSON이 실패합니다.NET MVC

mycopycode 2023. 8. 15. 11:06
반응형

ASP에서 null을 반환할 때 jQuery post JSON이 실패합니다.NET MVC

ASP를 사용합니다.다음 작은 라이브러리 기능을 사용하여 JQuery에서 JSON을 게시하고 일부 JSON을 반환하기 위한 NET MVC:

(function($) {
    $.postJson = function(url, data) {
        return $.ajax({
            url: url,

            data: JSON.stringify(data),
            type: 'POST',
            dataType: 'json',
            contentType: 'application/json; charset=utf-8'
        });
    };
})(jQuery);

그래서 분명히 저는 이것을 다음과 같이 부를 것입니다.

$('#button').click(function() {
    $.postJson('/controller/action', { Prop1: 'hi', Prop2: 'bye' })
    .done(function(r) { alert('It worked.'); })
    .fail(function(x) { alert('Fail! ' + x.status); });
});

ASP.NET MVC 3 및 ASP.NET MVC 4는 제출 측면을 지원합니다(이전에는 ASP를 확장해야 했습니다).JSON 제출을 처리하기 위한 NET MVC) 하지만 제가 마주치는 문제는 반품입니다.컨트롤러에서 다음과 같이 기본적으로 "성공, 다른 할 말 없음"이라고 말하기 위해 null을 반환하는 경우가 많습니다.

[HttpPost]
public JsonResult DoSomething(string Prop1, string Prop2)
{
    if (doSomething(Prop1, Prop2)
        return Json(null); // Success

    return Json(new { Message = "It didn't work for the following reasons" });
}

저는 이 패턴을 자주 사용하는데 잘 작동합니다. 성공/완료된 콜백이 호출되고 모든 것이 정상입니다.하지만 최근에 ASP를 업그레이드했습니다.NET MVC와 jQuery가 작동하지 않습니다. 대신 내 실패 콜백이 호출됩니다.return Json(null);게다가, 저는 응답을 조사했고, 상태 Code returning은 사실 200이기 때문에 서버에 장애가 발생하지 않습니다. jQuery는 그냥 그렇다고 말하고 있습니다.

이 문제는 jQuery 1.8에서 1.9로 업그레이드함으로써 발생했습니다.jQuery 1.7 및 1.8에서 MVC의 경우:

return Json(null);

유효한 JSON으로 받아들여졌고 null로 해석되었습니다.기술적으로, 이것은 HTTP 200으로 클라이언트에 빈 문자열을 다시 보내고, 그것은 jQuery < 1.9에 충분합니다.

그러나 이제 (우리는 jQuery 1.9.1을 사용하고 있다), 그것은 빈 문자열을 JSON으로 구문 분석하려고 시도하고, jQuery의 JSON 파서는 빈 문자열에 예외를 던지고, 그것은 다음으로 끝나는 코드 체인을 트리거합니다.fail()대신 콜백합니다.

해결 방법은 성공하면 다른 정보 없이 서버에서 이 정보를 다시 전달하는 것입니다.

return Json(new{});

그것은 jQuery의 JSON 파서와 함께 검사를 통과했고 모든 것이 좋습니다.이 기능은 다음과 같습니다.

return Json(true);


갱신하다

MVC의 이 동작 아래 무사 노트는 고장난 것 같습니다.JSON 사용에 대한 별도의 스택 오버플로 답변입니다.NET을 ASP의 기본 JSON 직렬화 프로그램으로 사용합니다.NET MVC 3 - 가능합니까?MVC가 다음에 대해 null을 반환하도록 하는 방법에 대해 설명합니다.Json(null)기본적으로, Json을 사용합니다.ASP 대신 NET.NET MVC의 내장된 JSON 시리얼라이저.이것이 결국 제가 사용하게 된 해결책입니다.

그러나 이 문제를 해결하려면 해당 답변의 약간 수정된 버전을 사용해야 합니다. 코드는 아래와 같습니다.기본적으로, 다음을 포함하지 않습니다.if직렬화하기 위해 통과하기 전에 null을 확인하는 문. 그렇지 않으면 동일한 곤경에 처하게 됩니다.


업데이트 2

Json에서 ISO 8601 날짜의 기본 구현.NET이 구문 분석을 시도할 때 Internet Explorer 9 이하가 깨집니다.new Date(...) 91987, Internet Explorer 9에서는 구문 이 정상입니다.

var date = new Date('2014-09-18T17:21:57.669');
var date = new Date('2014-09-18T17:21:57.600');

하지만 이는 예외입니다.

var date = new Date('2014-09-18T17:21:57.6');

Internet Explorer 9(인터넷 익스플로러 9)의 Date() 구현은 정확히 3밀리초의 위치를 제외하고는 처리할 수 없습니다.이 문제를 해결하려면 Json을 무시해야 합니다.강제 적용할 NET 날짜 형식입니다.아래 코드에 포함되어 있습니다.

public class JsonNetResult : JsonResult
{
    public override void ExecuteResult(ControllerContext context)
    {
        if (context == null)
            throw new ArgumentNullException("context");

        var response = context.HttpContext.Response;

        response.ContentType = !String.IsNullOrEmpty(ContentType) ? ContentType : "application/json";

        if (ContentEncoding != null)
            response.ContentEncoding = ContentEncoding;

        var settings = new JsonSerializerSettings
        {
            Converters = new[] {new IsoDateTimeConverter
            {
                DateTimeFormat = "yyyy'-'MM'-'dd'T'HH':'mm':'ss.fffK"
            }}
        };
        var jsonSerializer = JsonSerializer.Create(settings);

        jsonSerializer.Serialize(response.Output, Data);
    }
}

이를 기본 컨트롤러에 연결하는 방법을 보여주는 요약:

https://gist.github.com/b9chris/6991b341e89bb0a4e6d801d02dfd7730

언급URL : https://stackoverflow.com/questions/15939944/jquery-post-json-fails-when-returning-null-from-asp-net-mvc

반응형