Как передать параметр JSON с помощью $ajax в веб-службу asmx


Мой парамертер, как показано ниже:

var pMaster = '{"tid" : "474", "fid":"2"}';
var pDetail = '[{"recid":5618,"tid":"474","itemid":"1435","nar1":""},{"recid":5619,"tid":"474","itemid":"1203","nar1":""},{"recid":5620,"tid":"474","itemid":"1205","nar1":""}]';
var e = '{PurcMast: ' + pMaster  + ', PurDetail: ' + pDetail + '}';

Я вызываю ajax, как показано ниже

$.ajax({
        type: "POST",
        url: "WebService.asmx/saveValue",
        data: e,
        contentType: "application/json; charset=utf-8",
        dataType: "json",
        success: function (result) {
            alert(result.d);
        },
        error: function (jqXHR) { alert(jqXHR.responseText); }
    });

И WebService.код asmx, как показано ниже:

[ScriptMethod(ResponseFormat = ResponseFormat.Json)]
[WebMethod]    
public void saveValue(string PurcMast, string PurDetail)
{
    System.Data.DataTable purMaster = Common.CommonFunction.convertJSON2Table(Purchase);
    System.Data.DataTable purDetail = Common.CommonFunction.convertJSON2Table(PurchaseDetail);
}

Я получаю ошибку, как показано ниже:

Необнаруженная Ошибка.{"Message": "для типа u0027System не определен конструктор без параметров.Строкаu0027.", "StackTrace": "в системе.Сеть.Скрипт.Сериализация.Преобразователь объектов.ConvertDictionaryToObject(IDictionary 2 dictionary, Type type, JavaScriptSerializer serializer, Boolean throwOnError, Objectu0026 convertedObject)rn at System.Web.Script.Serialization.ObjectConverter.ConvertObjectToTypeInternal(Object o, Type type, JavaScriptSerializer serializer, Boolean throwOnError, Objectu0026 convertedObject)rn at System.Web.Script.Serialization.ObjectConverter.ConvertObjectToTypeMain(Object o, Type type, JavaScriptSerializer serializer, Boolean throwOnError, Objectu0026 convertedObject)rn at System.Web.Script.Services.WebServiceMethodData.StrongTypeParameters(IDictionary2 rawParams)rn at Система.Сеть.Скрипт.Сервисы.WebServiceMethodData.Callmethod fromrawparams (Object target, IDictionary 2 parameters)rn at System.Web.Script.Services.RestHandler.InvokeMethod(HttpContext context, WebServiceMethodData methodData, IDictionary2 rawParams)rn в системе.Сеть.Скрипт.Сервисы.RestHandler.ExecuteWebServiceCall (HttpContext context, WebServiceMethodData methodData)", "ExceptionType": "System.MissingMethodException"}

Ребята, пожалуйста, помогите мне, я не понимаю, что плохого я делаю.
3 3

3 ответа:

Я делаю это на своем сайте. Вот что я должен был сделать...

// remove the outer quotes so they are json objects then json encode.
var pMaster = JSON.stringify({"tid" : "474", "fid":"2"});
var pDetail = JSON.stringify(
    {"[{"recid":5618,"tid":"474","itemid":"1435","nar1":""}, 
    {"recid":5619,"tid":"474","itemid":"1203","nar1":""},
    {"recid":5620,"tid":"474","itemid":"1205","nar1":""}]);
// then create e by stringify a second time

var e = JSON.stringify({PurcMast: pMaster , PurDetail: pDetail });
Это сработало для меня. Вы просто создавали строки вместо сериализованных объектов json.

Я думаю, что вы передаете данные неверным путем. Попробуйте это:

var pMaster = '{"tid" : "474", "fid":"2"}';
var pDetail = '[{"recid":5618,"tid":"474","itemid":"1435","nar1":""},{"recid":5619,"tid":"474","itemid":"1203","nar1":""},{"recid":5620,"tid":"474","itemid":"1205","nar1":""}]';

$.ajax({
        type: "POST",
        url: "WebService.asmx/saveValue",
        data: {PurcMast: pMaster, PurDetail: pDetail },
        contentType: "application/json; charset=utf-8",
        dataType: "json",
        success: function (result) {
            alert(result.d);
        },
        error: function (jqXHR) { alert(jqXHR.responseText); }
    });

Ваш URL-адрес url: "WebService.asmx/saveValue" , а имя метода savePurchase

$.ajax({
        type: "POST",
        url: "WebService.asmx/savePurchase",
        data: e,
        contentType: "application/json; charset=utf-8",
        dataType: "json",
        success: function (result) {
            alert(result.d);
        },
        error: function (jqXHR) { alert(jqXHR.responseText); }
    });
Я думаю, что это должно сработать.