PageMethods, jQuery и JSON

Я пытаюсь вызвать PageMethod с помощью jQuery следующим образом:

[WebMethod]
public stataic string WebMethod(PostData data)
{
    //DO WORK
    return "a";
}

PostData класс выглядит следующим образом:

public class PostData
{
    public string Guid{get;set;}
    public string Action{get;set;}
    public string Id{get;set;}
}

Я вызываю метод из jQuery следующим образом:

$.ajax({
    type="POST",
    url: 'url',
    data: JSON.stringify(b),
    contentType: "application/json;charset=utf-8",
    dataType: "json",
    success: function (msg) {
        var t = $(c).html();
        $(c).html(t + "<br/>" + $.evalJSON(msg.d));
    },
    error: function (x, y) {
        var t = $(c).html();
        $(c).html(t + "<br/>" + $.evalJSON(x.responseText).Message);
    }
});

где b похоже на: {"PostData":{"Guid":"b61dce32-690b-4409-b51a-a6012462e54e","Action":"Testing","Id":"3"}}

Я получаю эту ошибку:

Invalid web service call, missing value for parameter: 'data'.

Если я не позвоню JSON.stringyfy, я получаю эту ошибку:

Invalid JSON primitive: PostData.

Я также пробовал это {"Guid":"b61dce32-690b-4409-b51a-a6012462e54e","Action":"Testing","Id":"3"}, но все равно получаю

Invalid JSON primitive 'Guid'

or

Invalid web service call, missing value for parameter: 'data'.

в зависимости от того, позвоню ли я JSON.stringify или нет.

Я также пробовал,

 [WebMethod]
 public static string WebMethod(string data)

но некуда.


person TheVillageIdiot    schedule 10.02.2011    source источник


Ответы (2)


Имена первых многоуровневых объектов в JSON должны совпадать с именами аргументов вашего веб-сервиса.

{"data": {"Guid":"b61dce32-690b-4409-b51a-a6012462e54e","Action":"Testing","Id":"3"} }
person jerone    schedule 10.02.2011
comment
да, я знал, что делаю что-то глупое, но не смог прибить это. Спасибо @jerone. - person TheVillageIdiot; 10.02.2011
comment
Спасибо! Я не могу сказать вам, как долго я рыскал, чтобы понять, почему я получаю ошибку 500 на моем jquery.post. Я даже не думал о том, чтобы назвать аргумент WebMethod внутри JSON, который я отправлял с клиента. - person dagilleland; 30.06.2012

Попробуй это,

       var params = {"PostData":{"Guid":"b61dce32-690b-4409-b51a-a6012462e54e","Action":"Testing","Id":"3"}}; 
       var yourdata = jQuery.param(params); 

проходить

ваши данные

как ваши данные вместо JSON.stringify(b).

person Furqan Hameedi    schedule 10.02.2011
comment
нет @Furqan jQuery.param преобразует его в закодированную строку. На самом деле мне нужно было data: в качестве имени объекта. - person TheVillageIdiot; 10.02.2011