我已经为此工作了3个小时,已经放弃了。我只是试图使用jQuery将数据发送到ASP.NET WebMethod。数据基本上是一堆键/值对。因此,我尝试创建一个数组并将这些对添加到该数组中。
我的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;
这是我的jQuery AJAX调用:
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
使用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); } } }