JQuery, ASMX и форматирование JSON - PullRequest
       13

JQuery, ASMX и форматирование JSON

1 голос
/ 19 февраля 2011

У меня есть следующий JS

  $('#Submit').click(function () {
            var name = $('#Name').val();
            var age = $('#Age').val();
            var phonenumber = $('#PhoneNumber').val();
            var isMale = $('#IsMale').val();
            var formdata = "'formdata':{name:'" + name + "',age:'" + age + "',phonenumber:'" + phonenumber + "',ismale:'" + isMale + "'}";
            $.ajax({
                type: "Post",
                url: "WebService/FormSubmission.asmx/SavePafForm",
                data: formdata,
                dataType: "json",
                contentType: "application/json; charset=utf-8",
                processdata: true,
                success: function (msg) { alert(msg.d); },
                error: function (result, errortype, exceptionobject) { alert('Error:' + result.responseText); }

            })

У меня есть следующий метод asmx

 [WebMethod]
    public string SavePafForm(string formdata)
    {
        string test = formdata;

        return test;
    }

Я получаю следующую ошибку

Error:{"Message":"Invalid JSON primitive: \u0027{name:\u0027tim\u0027,age:\u0027\u0027,phonenumber:\u0027\u0027,ismale:\u0027on\u0027}\u0027.","StackTrace":"   at System.Web.Script.Serialization.JavaScriptObjectDeserializer.BasicDeserialize(String input, Int32 depthLimit, JavaScriptSerializer serializer)\r\n   at System.Web.Script.Serialization.JavaScriptSerializer.Deserialize(JavaScriptSerializer serializer, String input, Type type, Int32 depthLimit)\r\n   at System.Web.Script.Serialization.JavaScriptSerializer.Deserialize[T](String input)\r\n   at System.Web.Script.Services.RestHandler.GetRawParamsFromPostRequest(HttpContext context, JavaScriptSerializer serializer)\r\n   at System.Web.Script.Services.RestHandler.GetRawParams(WebServiceMethodData methodData, HttpContext context)\r\n   at System.Web.Script.Services.RestHandler.ExecuteWebServiceCall(HttpContext context, WebServiceMethodData methodData)","ExceptionType":"System.ArgumentException"}

Когда я меняю свойjson строка для этого

var formdata = "{name:'" + name + "',age:'" + age + "',phonenumber:'" + phonenumber + "',ismale:'" + isMale + "'}";

и мой веб-метод для получения этой подписи

public string SavePafForm(string name, string age, string phonenumber, string ismale)

Я не получаю никакой ошибки.

Моя цель - передать до 20 параметров этому методу ... Я хотел бы передать его как один объект, с которым я могу иметь дело, а не 20 параметров в сигнатуре метода.

Есть идеи?

РЕДАКТИРОВАТЬ: Делайте все, что отмеченный ответ сказал, кроме изменения вашего объекта json на стороне клиента, чтобы сделать это

var formdata = JSON.stringify({ formdata: { name: $('#Name').val(), age: $('#Age').val(), phonnumber: $('#PhoneNumber').val(), ismale: $('#IsMale').val()} });

Ответы [ 2 ]

2 голосов
/ 19 февраля 2011

Поскольку на этот вопрос был дан правильный ответ, я не собираюсь делать еще одну публикацию о принятии типа объекта в ваш веб-сервис [в качестве класса или структуры], а вместо этого предложу предложение по созданию объекта для передачи.

Если вы создаете объект для сопоставления в JS, это значительно упрощает отслеживание ваших свойств (IMO), поэтому:


//Multiple methods to create object Foo

function Foo (name, phoneNumber, age, isMale){
    this.name = name;
    this.phoneNumber = phoneNumber
    this.age = age;
    this.isMale = isMale;
}

var foo = new Foo("name","phoneNumber","age","isMale");

var foo = {}
    foo.name = "name";
    foo.phoneNumber = "phoneNumber";
    foo.age = "age";
    foo.isMale = "isMale";

var formData = "'formData':{'" + $.toJSON(foo) + "'}'"

$.ajax({
    type: "Post",
    url: "WebService/FormSubmission.asmx/SavePafForm",
    data: formdata,
    dataType: "json",
    contentType: "application/json; charset=utf-8",
    processdata: true,
    success: function (msg) { alert(msg.d); },
    error: function (result, errortype, exceptionobject) { 
      alert('Error:' + result.responseText); 
    }
 });

2 голосов
/ 19 февраля 2011

Итак, вы можете определить тип:

public class Foo
{
    public string Name { get; set; }
    public string Age { get; set; }
    public string PhoneNumber { get; set; }
    public string IsMale { get; set; }
}

ваш веб-метод принимает этот объект в качестве параметра:

[WebMethod]
public string SavePafForm(Foo foo)
{
    ...
}

и затем вызвать:

$.ajax({
    type: 'POST',
    url: 'WebService/FormSubmission.asmx/SavePafForm',
    data: JSON.stringify({
        name: $('#Name').val(),
        age: $('#Age').val(),
        phoneNumber: $('#PhoneNumber').val(),
        isMale: $('#IsMale').val()
    }),
    dataType: 'json',
    contentType: 'application/json; charset=utf-8',
    success: function (msg) { 
        alert(msg.d); 
    },
    error: function (result, errortype, exceptionobject) { 
        alert('Error:' + result.responseText); 
    }
});
...