В моем случае проблема заключалась в том, что я вручную удалил некомпиляционный файл, который был помечен как «отсутствующий». Однажды я удалил ссылку на отсутствующий файл и перекомпилировал - все было хорошо.
При использовании AJAX. NET Я всегда делаю входной параметр простым старым объектом, а затем использую десериализатор javascript, чтобы преобразовать его в любой желаемый тип. По крайней мере, таким образом вы можете отлаживать и видеть, какой тип объекта получает веб-метод.
Вам необходимо преобразовать ваш объект в строку при использовании 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);
}
}
}
Украсьте свой [WebMethod] другим атрибутом:
[ScriptMethod(ResponseFormat = ResponseFormat.Json)]
Я считаю, что это находится в System.Web.Services.Scripting ...
В вашем примере, он должен работать, если ваш параметр данных:
data: "{'items':" + JSON.stringify(items) + "}"
Имейте в виду, что вам нужно отправить строку JSON в ASP.NET AJAX. Если вы укажете фактический объект JSON в качестве параметра данных jQuery, он будет сериализовать его как & вместо этого используются пары k = v? k = v.
Похоже, вы это уже читали, но взгляните еще раз на мой пример использования JavaScript DTO с jQuery, JSON.stringify и ASP.NET AJAX . Он охватывает все, что вам нужно для выполнения этой работы.
Примечание. Никогда не следует использовать JavaScriptSerializer для ручной десериализации JSON в «ScriptService» (как было предложено кем-то другим). Он автоматически сделает это за вас на основе указанных типов параметров вашего метода. Если вы обнаружите, что делаете это, значит, вы делаете это неправильно.
смотрите ссылку http://www.andrewrowland.com/article/display/consume-dot-net-web-service-with-jquery
Ниже приведен фрагмент кода из нашего проекта - у меня были проблемы с тем, что я не обернул объект как строку, а также со значениями Date - надеюсь, это кому-нибудь поможет:
// 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)
{