Передайте пользовательский объект в 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"}
Отсюда мы можем получить доступ к значениям.
Надеюсь, это даст вам некоторые рекомендации.