2014-04-13 4 views
0

나는 this 자습서를 따라 편안한 웹 API 서비스를 만들었습니다. 모든 것이 잘 작동하는 것처럼 보였습니다. JSON 형식의 모든 예약은 올바른 URL에서 요청하여 얻을 수 있습니다. 내 문제는 http POST입니다.asp.net Web-Api JSON 문자열 역 직렬화

내 자바 스크립트는 다음과 같습니다

var url = 'http://localhost:9077/api/bookings'; 
.... 
    var newEvent = []; 

    newEvent.EventDateTime = // (now); 
    newEvent.Name = "MyFirstBooking"; 

    function btnSubmit_Click() 
    { 
     alert("Submit clicked: " + newEvent.Name + "\n" + newEvent.EventDateTime); 

     $.ajax({ 
      type: "POST", 
      url: url, 
      data: JSON.stringify({ Bookings: newEvent }), 
      contentType: "application/json; charset=utf-8", 
      dataType: "json", 
      success: function(data) { alert(data); } 
     }); 
    } 

경고가 정확한 날짜와 또한 올바른 이름을 표시합니다. 내가 제출하고는 JSON이 올바르게 포맷과 같은 피들러 확인을 클릭하면 :

내 BookingsController에서
public class Bookings 
{ 
    public int ID { get; set; } 
    public string Name { get; set; } 
    public DateTime BookingDateTime { get; set; } 
    public DateTime EventDateTime { get; set; } 
    public int Duration { get; set; } 
    public int UserID { get; set; } 
} 

내가 가진 :

{"Bookings":[{"Name":"MyFirstBooking","EventDateTime":"2014-04-14T13:45:00.000Z"}]} 

내보기 Bookings.cs입니다

public HttpResponseMessage PostBooking(Bookings item) 
    { 
     // Implementation 
    } 

그러나 PostBooking 후에 중단 점을 넣으면 item.EventDateTime은 {01/01/0001 00:00:00}이고 Name은 null입니다. JSON이 제대로 deserialised되고 있지 않은 것 같습니다 ...? 나는 그것이 어디에서 언급했는지 찾을 수 없기 때문에 이것이 어디에서 일어나는 지 확신하지 못한다 ...

고마워.

답변

1

아프가니스탄의 날짜입니다. 재미 있지 않니?

ASP.NET Web API Date format in JSON does not serialise successfully

편집 : 아 나는 또한 눈치 당신은 가능성이 API의 사용자 정의 날짜 핸들러를 구현하거나 자바 스크립트에 converstion을하거나이 스택 오버 플로우 문제를 살펴해야 할 것보다 더 있습니다 JSON 객체는 배열입니다. 당신은 배열을 위해 서명을 변경해야합니다 : 다시

public HttpResponseMessage PostBooking(IEnumerable<Bookings> items) 
{ 
    // Implementation 
} 

편집 : 두 번째 생각에

, 나는 이벤트가 배열 될 필요 같아요. 나는 당신이 이것을하고 싶다고 생각한다 :

var newEvent ={}; 

이것은 newEvent를 배열 대신 객체로 초기화 할 것이다. 그러면 서명을 그대로 둘 수 있습니다. 그의 대답에서 언급 한 tomasofen과 같은 param 이름을 변경해야 할 수도 있습니다. 다시

편집 :

더 생각 : 그냥 대신 이렇게 : 당신은 JSON에의 contentType을 설정하는

$.ajax({ 
     type: "POST", 
     url: url, 
     data: JSON.stringify(newEvent), 
     contentType: "application/json; charset=utf-8", 
     dataType: "json", 
     success: function(data) { alert(data); } 
    }); 

: 당신은 {newEvent "예약"}와 객체를 근절하기 위해 필요 없어요. 그러면 웹 응용 프로그램에 콘텐츠가 json이어야하며 서버에서 처리하고 변환합니다. 이를 문자열로 변환하면 내용을 문자열로 바꿔서 contentType을 변경합니다.

+0

DateTime 개체를 제거하고 'UserID'속성에 대한 참조를 넣었으므로 이제 Javascript에서 모든 DateTime obj에 대한 참조가 없으며 항목에 대해 여전히 'null'이 표시됩니다. 나는'newEvent = {};를 변경했다. 내 새 JSON 문자열은 {{ "item": { "Name": "MyFirstBooking", "UserID": 2}}' – cdsln

+0

tomasofen의 답변도 시도 했습니까? 나는 그가 옳을 수도 있다고 생각한다. – kmacdonald

+0

우리는 서버 측에서 예약에 대한 정의를 알지 못하지만, 그것에 대해 생각할 때, 그것은 복수형이며 실제로는 어떤 종류의 수집 일 것입니다. 당신은 서버 함수의 항목의 정의를 단순히 객체의 배열로 바꾸는 테스트를 시도 할 수 있습니다 ... – tomasofen

0

json으로 파라미터의 이름과 서버에있어서의 변수에 대해 동일한 이름을 사용하여 시도 : 서버 측

:

public HttpResponseMessage PostBooking(Bookings item) 
    { 
     // Implementation 
    } 

클라이언트 측이 (단지 이름으로 "항목"변경 이 매개 변수는 다음과 같습니다.

{"item":[{"Name":"MyFirstBooking","EventDateTime":"2014-04-14T13:45:00.000Z"}]} 

이 경우 문제가 발생했을 가능성이 큽니다. 그것이 효과가 있는지 알려주거나 다른 것들을 시도하지 마십시오.

서버의 개체 예약에 같은 이름으로 작성된 이름 및 EventDateTime 멤버가 있는지 확인하십시오.

+0

그러나 item은 배열입니다. 그의 서명은 그것을 반영해야합니다. – kmacdonald

+0

예, kmacdonald 응답이 멋지게 보입니다. :) – tomasofen