2009-07-17 63 views
19

我一直在爲此工作了3個小時並放棄了。 我只是簡單地嘗試使用jQuery將數據發送到一個asp.net web方法。 數據基本上是一堆鍵/值對。所以我試圖創建一個數組並添加對該數組。成功發送JSON對象到asp.net WebMethod,使用jQuery

我的WebMethod(aspx.cs)看起來是這樣的(這可能是錯誤的,我建立在JavaScript什麼,我只是不知道):

[WebMethod] 
    public static string SaveRecord(List<object> items) 
    ..... 

這裏是我的JavaScript示例:

var items = new Array;

var data1 = { compId: "1", formId: "531" }; 
    var data2 = { compId: "2", formId: "77" }; 
    var data3 = { compId: "3", formId: "99" }; 
    var data4 = { status: "2", statusId: "8" }; 
    var data5 = { name: "Value", value: "myValue" }; 

    items[0] = data1; 
    items[1] = data2; 
    items[2] = data3; 
    items[3] = data4; 
    items[4] = data5; 
Here is my jQuery ajax call: 

var options = { 
     error: function(msg) { 
      alert(msg.d); 
     }, 
     type: "POST", 
     url: "PackageList.aspx/SaveRecord", 
     data: { 'items': items }, 
     contentType: "application/json; charset=utf-8", 
     dataType: "json", 
     async: false, 
     success: function(response) { 
      var results = response.d; 
     } 
    }; 
    jQuery.ajax(options); 

我得到的錯誤 - Invalid JSON primitive: items. -

所以...如果我這樣做:

var DTO = { 'items': items };

,並設置這樣的數據參數:

data: JSON.stringify(DTO)

然後我得到這個錯誤:

Cannot convert object of type \u0027System.String\u0027 to type \u0027System.Collections.Generic.List`1[System.Object]\u0027 
+0

將您的web方法更改爲接受普通的舊Object,然後查看該對象的具體內容,然後在Web方法中進行投射和處理。 – 2009-07-18 02:01:02

+0

雖然問題在於,您正在使用webmethods,但未使用爲您自動生成的JavaScript代理類? – 2009-07-18 02:02:23

+0

感謝科裏,我最初改變了網絡方法接受一個普通的對象,這幫助我找出了期望。謝謝! – 29er 2009-07-20 04:21:10

回答

8

當使用AJAX.NET時,我總是使輸入參數只是一個普通的舊對象,然後使用JavaScript解串器將其轉換爲我想要的任何類型。至少你可以通過這種方式調試並查看web方法在接收什麼類型的對象。

您需要將對象轉換爲字符串使用jQuery

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> 

<html xmlns="http://www.w3.org/1999/xhtml" > 
<head runat="server"> 
    <title></title> 
</head> 
<body> 
    <form id="form1" runat="server"> 
     <asp:ScriptManager ID="sm" runat="server" EnablePageMethods="true"> 
      <Scripts> 
       <asp:ScriptReference Path="~/js/jquery.js" /> 
      </Scripts> 
     </asp:ScriptManager> 
     <div></div> 
    </form> 
</body> 
</html> 
<script type="text/javascript" language="javascript"> 
    var items = [{ compId: "1", formId: "531" }, 
     { compId: "2", formId: "77" }, 
     { compId: "3", formId: "99" }, 
     { status: "2", statusId: "8" }, 
     { name: "Value", value: "myValue"}]; 

     //Using Ajax.Net Method 
     PageMethods.SubmitItems(items, 
      function(response) { var results = response.d; }, 
      function(msg) { alert(msg.d) }, 
      null); 

     //using jQuery ajax Method 
     var options = { error: function(msg) { alert(msg.d); }, 
         type: "POST", url: "WebForm1.aspx/SubmitItems", 
         data: {"items":items.toString()}, // array to string fixes it * 
         contentType: "application/json; charset=utf-8", 
         dataType: "json", 
         async: false, 
         success: function(response) { var results = response.d; } }; 
     jQuery.ajax(options); 
</script> 

而後面的代碼

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Web; 
using System.Web.Services; 
using System.Web.Script.Serialization; 
using System.Web.Script.Services; 
using System.Web.UI; 
using System.Web.UI.WebControls; 

namespace CustomEquip 
{ 
    [ScriptService] 
    public partial class WebForm1 : System.Web.UI.Page 
    { 
     protected void Page_Load(object sender, EventArgs e) 
     { 

     } 
     [WebMethod] 
     public static void SubmitItems(object items) 
     { 
      //break point here 
      List<object> lstItems = new JavaScriptSerializer().ConvertToType<List<object>>(items); 
     } 
    } 
} 
3

裝飾你的[的WebMethod]與另一個屬性:

[ScriptMethod(ResponseFormat = ResponseFormat.Json)] 

我相信這是在System.Web.Services.Scripting ...

+5

我認爲問題不在於服務器無法將JSON發送到客戶端,問題在於服務器無法對傳入的JSON進行反序列化。 – SolutionYogi 2009-07-17 23:38:05

46

在您的例子時,如果你的數據參數是它應該工作:

data: "{'items':" + JSON.stringify(items) + "}" 

請記住,您需要發送一個JSON字符串到ASP.NET AJAX。如果您將實際的JSON對象指定爲jQuery的數據參數,則會將其序列化爲& k = v?k = v對。

看起來你已經閱讀過,但再看看我的example of using a JavaScript DTO with jQuery, JSON.stringify, and ASP.NET AJAX。它涵蓋了您做這項工作所需的一切。

注意:您不應該使用JavaScriptSerializer在「ScriptService」中手動反序列化JSON(如其他人所建議的那樣)。它會根據您的方法的指定類型的參數自動爲您執行此操作。如果你發現自己這樣做,你做錯了。

5

以下是我們項目的代碼片段 - 我遇到了麻煩沒有包裝的對象爲一個字符串,也與日期的價值觀 - 希望這可以幫助別人:

 // our JSON data has to be a STRING - need to send a JSON string to ASP.NET AJAX. 
     // if we specify an actual JSON object as jQuery's data parameter, it will serialize it as ?k=v&k=v pairs instead 
     // we must also wrap the object we are sending with the name of the parameter on the server side – in this case, "invoiceLine" 
     var jsonString = "{\"invoiceLine\":" + JSON.stringify(selectedInvoiceLine) + "}"; 

     // reformat the Date values so they are deserialized properly by ASP.NET JSON Deserializer    
     jsonString = jsonString.replace(/\/Date\((-?[0-9]+)\)\//g, "\\/Date($1)\\/"); 

     $.ajax({ 
      type: "POST", 
      url: "InvoiceDetails.aspx/SaveInvoiceLineItem", 
      data: jsonString, 
      contentType: "application/json; charset=utf-8", 
      dataType: "json" 
     }); 

服務器的方法簽名是這樣的:

[WebMethod] 
    public static void SaveInvoiceLineItem(InvoiceLineBO invoiceLine) 
    { 
0

這是你定義你的數據(JSON)的方式

data: { 'items': items }, 

和這個事情應該是這樣

data: '{ items: " '+items +' "}', 

基本上你是序列化的參數。