2010-06-19 48 views
1

實際上,我試圖學習對asp.Net webservices的jQuery Ajax調用。關於此代碼的幫助,它試圖:對需要返回JSON的Web服務進行jQuery Ajax調用

我一直在試圖撥打下面的WebMethod:

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相關回應說結果:

{「消息「:」無效的JSON基元:名字。「,」StackTrace「:」System.Web.Script.Serialization.Java上System.Web.Script.Serialization.JavaScriptObjectDeserializer.DeserializePrimitiveObject()\ r \ n在System.Web.Script.Serialization.JavaScriptObjectDeserializer.BasicDeserialize(字符串輸入,Int32 depthLimit,JavaScriptSerializer序列化程序)上的ScriptObjectDeserializer.DeserializeInternal(Int32深度)\ r \ n \ r \ n System.Web.Script.Serialization.JavaScriptSerializer.Deserialize JavaScriptSerializer序列化程序,字符串輸入,類型類型,Int32 depthLimit)\ System.Web.Script.Services.RestHandler上System.Web.Script.Serialization.JavaScriptSerializer.Deserialize [T](String input)\ r \ n \ r \ n。 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)「,」ExceptionType「:」System.ArgumentException「}

我是否需要序列化我的在設置'data'屬性之前以某種方式設置對象,以便我可以調用$ .ajax()函數?

感謝

回答

2

基於錯誤似乎與您發送到呼叫的JSON數據的問題。我不是100%肯定的,但是這個錯誤似乎表明它在試圖反序列化一個int時發生,所以它或者是導致問題的Datetime的反序列化。出現問題的原因是,如果其中一個是空字符串,或者是null/undefined,則解串器無法爲其分配值。

您可以在您的Person類中使int和DateTime值爲空(int?和DateTime?),如果它們不存在於服務調用收到的數據中,則允許反序列化器將值賦給值。另一種選擇是在發送帶有Ajax調用的JSON數據之前,在JavaScript端指定一些有效的默認值(如0和1/1/1800)。

+0

我試圖通過刪除DateTime屬性,它的工作。我將致力於如何使其工作。謝謝ckramer。另外,感謝@patrick爲stringify建議。 – pencilCake 2010-06-20 00:05:56

+0

太棒了,很高興我能幫到你。 – ckramer 2010-06-20 00:15:55

2

您可能需要將您的對象變爲有效的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