2017-12-29 10 views
0

EDIT2 : 솔루션 발견, 문제는 아약스 호출에서 매개 변수로 서버 측에서의 WebMethod로 전송되지 않습니다 것을 었죠 JSON, AJAX, and ASP.NETJSON 캐릭터 라인 화는 어레이에서 작동하지 않음 (ASP.NET)

참조하십시오 문자열. ajax 호출의 데이터 필드에있는 JSON 문자열은 실제로 WebMethod 매개 변수에 지정된 객체 유형으로 변환됩니다. 즉, 내 문제는 데이터가 문자열로 WebMethod에 전달되지 않고 다른 객체 유형으로 전달된다는 것입니다.

EDIT : Chrome의 브라우저 콘솔에서 오류가 발생합니다. 리소스를로드하지 못했습니다. 서버가 500 (내부 서버 오류) 상태로 응답했습니다. 더 깊이 파고, 나는 다음과 같은 응답이 :

{"Message":"Type \u0027System.Collections.Generic.IDictionary`2[[System.String, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089],[System.Object, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089]]\u0027 is not supported for deserialization of an array.","StackTrace":" at System.Web.Script.Serialization.ObjectConverter.ConvertListToObject(IList list, Type type, JavaScriptSerializer serializer, Boolean throwOnError, IList\u0026 convertedList)\r\n at System.Web.Script.Serialization.ObjectConverter.ConvertObjectToTypeInternal(Object o, Type type, JavaScriptSerializer serializer, Boolean throwOnError, Object\u0026 convertedObject)\r\n at System.Web.Script.Serialization.ObjectConverter.ConvertObjectToTypeMain(Object o, Type type, JavaScriptSerializer serializer, Boolean throwOnError, Object\u0026 convertedObject)\r\n at System.Web.Script.Serialization.JavaScriptSerializer.Deserialize(JavaScriptSerializer serializer, String input, Type type, Int32 depthLimit)\r\n at System.Web.Script.Serialization.JavaScriptSerializer.Deserialize[T](String input)\r\n at System.Web.Script.Services.RestHandler.GetRawParamsFromPostRequest(HttpContext context, JavaScriptSerializer serializer)\r\n at System.Web.Script.Services.RestHandler.GetRawParams(WebServiceMethodData methodData, HttpContext context)\r\n at System.Web.Script.Services.RestHandler.ExecuteWebServiceCall(HttpContext context, WebServiceMethodData methodData)","ExceptionType":"System.InvalidOperationException"} 

은 다음 아약스 호출이 실행되지 않습니다, 그리고 데이터 매개 변수가 유효한 값이없는 것처럼 보인다. data이 유효한 JSON이있는 문자열 리터럴과 같게 설정되면 아무런 문제가 없습니다. ajax 호출에서 자바 스크립트 객체를 data에 대한 유효한 매개 변수로 변환하는 데 문제가있는 것 같습니다.

<script type="text/javascript"> 
     $(document).ready((function() { 
      $('#mytable tr').click(function (event) { 
       var array = []; 
       $(".tdval").each(function() { 
        array.push({ 
         value: $(this).html() 
        }); 
       }); 
       alert(JSON.stringify(array)); //produces what appears to be valid json after calling stringify: [{"value":"val1"},{"value":"val2"}] 

       $.ajax({ 
        type: "POST", 
        url: "schedule.aspx/GetCurrentTime", 
        data: JSON.stringify({ array }), //this seems to be the issue 
        contentType: "application/json; charset=utf-8", 
        dataType: "json", 
        success: function (response){ 
         alert(response.d + "lol"); 
        }, 
        complete: function() { 
         alert("complete"); 
        } 
       }); 
      }); 
     })); 
    </script> 

을 그리고 이것은 해당 아약스 호출 게시물 뒤에 C# 코드에서 방법 : 내 영문 파일에 아래의 코드를 참조하십시오 흥미롭게

[System.Web.Services.WebMethod] 
    public static string GetCurrentTime(string name) 
    { 
     return "Hello "; 
    } 

, 나는 data: JSON.stringify({ array })을 변경할 수 있어요 아약스 호출에서 임의의 JSON을 문자열 리터럴로 호출하면 정상적으로 작동합니다. 그러나 stringify를 사용하면 ajax 호출의 "성공"콜백 메소드가 실행되지 않습니다. 이견있는 사람? 당신이 JSON.stringify()를 호출 할 때

+2

이유는 두 번째 캐릭터 라인 화 통화 중괄호가있다? 이것들은 필요 없다고 생각합니다. – ne1410s

+0

'{array}'는'{array : array}'의 ES6 속기입니다. 그래서 JSON은 배열을 JSON 객체의''array "'속성에 가질 것입니다. 그것은 컨트롤러가 기대하는 것입니까? – Barmar

답변

0

당신은 객체의 내부 배열을, 그래서 당신이 전송하고있는 JSON과 같은 모양 :

{ array: [{"value":"val1"},{"value":"val2"}] } 

대신 이전 기능에 경고 무엇.

대신 사용 :

data: JSON.stringify(array), 
+0

중괄호를 제거한 후에도 여전히 작동하지 않습니다. 실제로이를 사용하는 것은 의도하지 않았습니다. 문제 해결에서 남은 것이 었습니다. 나는 JSONLint를 사용하여 JSON이 유효한지 여부를 테스트했으며, 그것이 사실이라고 말하고있다. 다른 제안? –

+0

콘솔의 네트워크 탭에서 AJAX 요청이 전송되고 있는지, 매개 변수가 무엇인지, 컨트롤러의 응답이 무엇인지 확인 했습니까? – Barmar

+0

'{ "name": "Bob"} 문자열 리터럴을 사용할 때 코드가 작동합니다. 그러나 JSONLint가 유효한 JSON을 말하고 있음에도 불구하고 [{ "value": "val1"}, { "value": "val2"}]는 작동하지 않습니다. 이 코드를 사용하여 모든 코드를 사용할 수 있도록 C# 코드 숨김 메서드를 표시하도록 코드를 업데이트했습니다. –

관련 문제