Справка по этому коду, который пытается: сделать JQuery Ajax-вызов веб-службы, которая должна вернуть JSON - PullRequest
1 голос
/ 20 июня 2010

На самом деле я пытаюсь выучить вызовы jQuery Ajax к веб-сервисам asp.Net.

Я пытался вызвать веб-метод ниже:

public class Person
    {
        public string FirstName { get; set; }
        public string Id { get; set; }
        public string LastName { get; set; }
        public string Department { get; set;}
        public DateTime Birthday { get; set; }
    }

public class PersonWebServices : System.Web.Services.WebService {


    [WebMethod]
    [ScriptMethod]
    public Person GetPerson(Person personToCompare)
    {
        return GetPerson(personToCompare.Id);
    }

    [WebMethod]
    public Person GetPerson(string Id)
    {
        if (string.IsNullOrEmpty(Id))
            return null;

        Id = Id.Trim();

        return PersonCollection.GetCachedPersonList().Find(personToCompare => personToCompare.Id == Id);
    }

}

И мой JavaScript такой:

<script type="text/javascript">
    function loadPerson(txtPersonId){

        if(!txtPersonId.length || !(txtPersonId.val().length)){
            return;
            }
        var ajaxCallOptions = {
                  type: "POST",
                  contentType: "application/json; charset=utf-8",
                  url: "/JQuery/Chapter15-AJAX/PersonWebServices.asmx/GetPerson",
                  data: {FirstName:'',LastName:'', Id:txtPersonId.valueOf(),Birthday:'',Department:''},
                  dataType: "json",
                  success: function(msg){
                    alert('done');
                  },
                  error: function(msg){
                    alert('Error: '+msg.status);
                  }

                            }


        jQuery.ajax(ajaxCallOptions);



    };
    </script>

В результате получается ответ, связанный с JSON:

{"Message": "Недопустимый примитив JSON: FirstName.", "StackTrace": "в System.Web.Script.Serialization.JavaScriptObjectDeserializer.DeserializePrimitiveObject () \ r \ n в System.Web.Script.Serialization..JavaScriptObjectDeserializer.DeserializeInternal (глубина Int32) \ r \ n в System.Web.Script.Serialization.JavaScriptObjectDeserializer.BasicDeserialize (строковый ввод, Int32 deepLimit, сериализатор JavaScriptSerializer) \ r \ n в System.Web.Script.Serialization.JavaScriptizeerial.(Сериализатор JavaScriptSerializer, строковый ввод, тип Type, Int32 deepLimit) \ r \ n в System.Web.Script.Serialization.JavaScriptSerializer.Deserialize [T] (строковый ввод) \ r \ n в System.Web.Script.Services.RestHandler.GetRawParamsFromPostRequest (контекст HttpContext, сериализатор JavaScriptSerializer) \ r \ n в System.Web.Script.Services.RestHandler.GetRawParams (метод WebServiceMethodData methodData, контекст HttpContext) \ r \ n в System.Web.Script.Services.RestHandler.ExecuteWebServiceCall (контекст HttpContext, метод WebServiceMethodData methodData), «Исключение» 1012: «Исключение».* Нужно ли каким-либо образом сериализовать мой объект перед установкой атрибута 'data', чтобы я мог вызвать функцию $ .ajax ()?

спасибо

Ответы [ 2 ]

2 голосов
/ 20 июня 2010

Скорее всего, вам потребуется превратить ваш объект в действительный JSON, а не в объект javascript.

Это можно сделать с помощью вызова JSON.stringify(), например:

data: JSON.stringify({FirstName:'',LastName:'', Id:txtPersonId.valueOf(),Birthday:'',Department:''}),

который превратит:

{FirstName:'',LastName:'', Id:txtPersonId.valueOf(),Birthday:'',Department:''}

в:

'{"FirstName":"","LastName":"","Id":"somevalue","Birthday":"","Department":""}'

Не все браузеры поддерживают JSON, поэтому вам нужно будет включить библиотеку JSON2.

https://github.com/douglascrockford/JSON-js/blob/master/json2.js

2 голосов
/ 20 июня 2010

Судя по ошибке, возникает проблема с данными JSON, которые вы отправляете на вызов.Я не уверен на 100%, но ошибка, по-видимому, указывает на то, что это происходит при попытке десериализации int, так что это или десериализация Datetime, которые вызывают проблемы.Причина в том, что проблема заключается в том, что если либо пустая строка, либо null / undefined, десериализатор не сможет присвоить ему значение.

Вы можете сделать значения int и DateTime обнуляемыми (int? И DateTime?) В своем классе Person, что позволит десериализатору присваивать значения NULL, если они не существуют в данных, полученных службой.вызов.Другим вариантом является присвоение некоторого допустимого значения по умолчанию (например, 0 и 1/1/1800) на стороне JavaScript перед отправкой данных JSON с помощью вызова Ajax.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...