MVC ajax json post для метода действия контроллера
Я пытаюсь получить вызов JQuery AJAX к методу действий контроллера, который содержит сложный объект в качестве параметра.
Я прочитал много блогов и попробовал несколько методов, полученных из них. Ключевой пост, на котором я построил мой лучший код попытки (ниже), - это postoverflow post здесь.
Я хочу вызвать асинхронный пост, вызывается, когда пользователь выталкивает поле [не сообщение сохранения формы, как показано в других примерах, которые я нашел].
Я намерен:
- Создавать объект на клиенте [не ViewModel, который предоставляет тип представления);
- Заполните объект данными из нескольких полей в представлении;
- Преобразовать этот объект в JSON;
- Вызвать метод действия контроллера, используя метод jQuery.Ajax, передающий объект JSON.
Результаты будут возвращены как результат JSON; и данные будут загружены в поля в представлении в зависимости от возвращаемых результатов.
Проблемы:
- Если метод действия присваивается атрибутом HttpPost, метод действия контроллера не вызывается (даже если тип вызова AJAX установлен на "POST" ).
- Если метод действия присваивается HttpGet, значения свойств параметра равны нулю
- Метод ReadObject генерирует ошибку: "Ожидание элемента" root "из пространства имен". "Encounted" None "с именем" namespace ".
Надеюсь, кто-то может помочь. Благодарю. Код ниже:
Клиентский файл js
var disputeKeyDataObj = {
"InvoiceNumber": "" + $.trim(this.value) + "",
"CustomerNumber": "" + $.trim($('#CustomerNumber').val()) + ""
};
var disputeKeyDataJSON = JSON.stringify(disputeHeadlineData);
$.ajax({
url: "/cnr/GetDataForInvoiceNumber",
type: "POST",
data: disputeKeyDataJSON,
dataType: 'json',
contentType: "application/json; charset=utf-8",
success: EnrichedDisputeKeyData(result)
});
Фильтр действий и класс для типа, связанного с параметром метода действий
[DataContract]
public class DisputeKeyData
{
[DataMember(Name = "InvoiceNumber")]
public string InvoiceNumber { get; set; }
[DataMember(Name = "CustomerNumber")]
public string CustomerNumber { get; set; }
}
Метод действий на контроллере
//[HttpPost]
[ObjectFilter(Param = "disputeKeyData", RootType = typeof(DisputeKeyData))]
public ActionResult GetDataForInvoiceNumber(DisputeKeyData disputeKeyData)
{
//Blah!
//....
return Json(disputeKeyData, JsonRequestBehavior.AllowGet);
}
Ответы
Ответ 1
Ниже я узнал, как это работает.
Ключевым моментом было:
Мне нужно было использовать ViewModel, связанный с представлением, чтобы среда выполнения могла разрешить объект в запросе.
[Я знаю, что существует способ привязать объект, отличный от объекта ViewModel по умолчанию, но в итоге просто заполнил необходимые свойства для моих нужд, поскольку я не мог заставить его работать]
[HttpPost]
public ActionResult GetDataForInvoiceNumber(MyViewModel myViewModel)
{
var invoiceNumberQueryResult = _viewModelBuilder.HydrateMyViewModelGivenInvoiceDetail(myViewModel.InvoiceNumber, myViewModel.SelectedCompanyCode);
return Json(invoiceNumberQueryResult, JsonRequestBehavior.DenyGet);
}
JQuery script используется для вызова этого метода действий:
var requestData = {
InvoiceNumber: $.trim(this.value),
SelectedCompanyCode: $.trim($('#SelectedCompanyCode').val())
};
$.ajax({
url: '/en/myController/GetDataForInvoiceNumber',
type: 'POST',
data: JSON.stringify(requestData),
dataType: 'json',
contentType: 'application/json; charset=utf-8',
error: function (xhr) {
alert('Error: ' + xhr.statusText);
},
success: function (result) {
CheckIfInvoiceFound(result);
},
async: true,
processData: false
});
Ответ 2
Этот пост в блоге напрямую решает вашу проблему.
Он использует технику без необходимости в дополнительных клиентских библиотеках JSON. Он представляет собой действительно простой плагин jQuery, который поможет вам сделать трюк.
Ответ 3
Какую версию asp.net mvc вы используете? Публикация json-объектов на строго типизированные действия контроллера только что добавлена в ASP.NET MVC 3 Beta 1. В этой статье объясняется обходной путь с использованием привязок к объектам asp.NET mvc 2 и информацию о том, как он работает в MVC 3.