Monday, May 20, 2024
 Popular · Latest · Hot · Upcoming
184
rated 0 times [  191] [ 7]  / answers: 1 / hits: 67098  / 15 Years ago, fri, july 17, 2009, 12:00:00

I've been working on this for 3 hours and have given up.
I am simply trying to send data to an ASP.NET WebMethod, using jQuery.
The data is basically a bunch of key/value pairs. So I've tried to create an array and adding the pairs to that array.



My WebMethod (aspx.cs) looks like this (this may be wrong for what I'm building in JavaScript, I just don't know):



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


Here is my sample 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);


I get the error:



Invalid JSON primitive: items.


So, if I do this:



var DTO = { 'items': items };


and set the data parameter like this:



data: JSON.stringify(DTO)


Then I get this error:



Cannot convert object of type u0027System.Stringu0027 to type u0027System.Collections.Generic.List`1[System.Object]u0027

More From » asp.net

 Answers
31

When using AJAX.NET I always make the input parameter just a plain old object and then use the javascript deserializer to covert it to whatever type I want. At least that way you can debug and see what type of object the web method in is recieving.



You need to convert your object to a string when using 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>


And the Code Behind



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);
}
}
}

[#99103] Tuesday, July 14, 2009, 15 Years  [reply] [flag answer]
Only authorized users can answer the question. Please sign in first, or register a free account.
francokeganr

Total Points: 438
Total Questions: 102
Total Answers: 124

Location: Belarus
Member since Sat, Jul 18, 2020
4 Years ago
;