Передайте пользовательский объект в ASP.NET Webmethod из jQuery, используя JSON

Я пытаюсь передать какой-то простой JSON в ASP.NET 4.5 Webmethod из jQuery. И он работает не так, как я хочу. Он работает, если я принимаю входы как отдельные параметры:

[WebMethod]
public static Address GetJSonAddress(string name, string street)

Но если я попытаюсь воспринимать его как объект, он не работает, то, что передается, просто null:

[WebMethod]
public static Address GetJSonAddress(Address newAddress)

Я пробовал Webmethods, Pagemethods, WCF, используя DataContractJsonSerializer... ничего. Класс Address оформлен соответствующим образом с помощью Datamember/DataContract. Свойства сопоставляются, включая случай.

jQuery, в котором я пробовал всевозможные передачи данных, включая обертывание в объект Address... если я делаю это иначе, чем то, что у меня есть, Webmethod не вызывается, и я получаю ошибку 500:

Save2 = function () {
var address = { prefix: GLOBALS.curr_prefix };

$('input[id^=' + GLOBALS.curr_prefix + '],select[id^=' + GLOBALS.curr_prefix + ']').each(function () {
       address[this.id.substr(4)] = $.trim($(this).val());
})

$.ajax({
    type: "POST",
    contentType: "application/json; charset=utf-8",
    url: "/WebServices/Insert",
    data: JSON.stringify(address),
    dataType: "json",
    success: function (data, textStatus) {
        console.log(data, textStatus);
    },
    failure: function (errMsg) {
        MsgDialog(errMsg);
    }
});
}

В конце концов мне придется делать это с помощью 121 строки ввода и действительно не хочу иметь метод с 121 параметром. Любая помощь приветствуется.

Ответ 1

Я быстро настроил этот проект, и мне удалось успешно позвонить на мой веб-метод, пожалуйста, скорректируйте свой код соответствующим образом. Убедитесь, что ваши имена свойств класса те же, что и те, которые вы передаете через JavaScript.

Webservice

    public static Contact getContact(Contact cnt)
    {
        cnt.name = "Abijeet Patro";
        cnt.phone = "Blah Blah";
        return cnt;
    }

JavaScript/JQuery

    $(document).ready(function () {
        var cnt = {name:'Hello',phone:'Hello'};
        $.ajax({
            type: "POST",
            url: "/Default.aspx/getContact",
            contentType: "application/json; charset=utf-8",
            dataType: "json",
            data: JSON.stringify({'cnt':cnt}), // Check this call.
            success: function (data) {
                debugger;
            }
        });
    });

Класс

public class Contact
{
    public string name { get; set; }
    public string phone { get; set; }
}

Web Service Called


enter image description here

Вы можете захватить проект здесь. Также, пожалуйста, используйте скрипач или Chrome для мониторинга запросов/ответов AJAX. Я добавил изображение, чтобы показать, как контролировать запросы AJAX с помощью Chrome. Скрипач еще лучше и подробнее.


enter image description here

Ответ 2

I am not aware of ASP. Но в Ruby on Rails мы используем следующую процедуру. Моя форма имеет около 20 полей. Через serializeArray(); я могу отправить все значения полей ввода в контроллер. Как

Ваш HTML должен выглядеть как

<input class="input" id="violation_date" type="text" name="violation_date" value=""/>
Здесь полезно поле

"name".

var form = $("form#driver_info_form").serializeArray();
var hsh = { }
$.each(form, function(i, e) {
            hsh[e.name] = e.value
        });

var jqxhr = $.post("/app/DriverInfo/save_driver_info", {
            hsh: hsh
        }, function() { });

На стороне контроллера мы можем получить параметр как

{"hsh"=>{"violation_date"=>"date", "violation_time"=>"time", "violation_day"=>"week", "username"=>"name", "address"=>"address", "city"=>"city", "state"=>"state", "zip"=>"", "driver_lic_number"=>"123324", "radio_commercial"=>"Yes", "age"=>"", "birth_date"=>"", "sex"=>"", "hair"=>"", "eyes"=>"", "height"=>"", "weight"=>"", "race"=>""}, "accident_check"=>"false", "misdemeanor"=>"false", "traffic"=>"false", "non_traffic"=>"false", "commercial"=>"Yes"}

Отсюда мы можем получить доступ к значениям.

Надеюсь, это даст вам некоторые рекомендации.