Я искал это и проверял все StackOverflow, но мне что-то не хватает... У меня есть ненавязчивый jQuery, который хихикает простым нажатием кнопки. Он подсчитывает флажки и добавляет каждое значение отмеченных ячеек в массив. Список верен, когда я использую поле предупреждения в jQuery, но массив никогда не делает его на стороне контроллера. Код поступает в контроллер, но я прерываю var resolutionViewModel = new ResolutionViewModel(); и проверить trans - аргумент равен null. Я новичок в jQuery и действительно могу использовать помощь здесь.
JQuery
// Return the selected transactions
function resolveTransactions() {
$('#btnResolve').click(function() {
var selectedTransactions = new Array();
$('input[name="chkTransaction"]:checked').each(function() {
selectedTransactions.push(this.value);
});
if (selectedTransactions.length > 0) {
$.ajax({
type: 'POST',
dataType: 'json',
url: 'http://localhost/AuditLog/Home/ResolutionFormDisplay',
contentType: 'application/json; charset=utf-8',
data: {trans : selectedTransactions},
traditional: true,
success: function (data) { alert(data); },
error: function(xhr, status, errorThrown) { alert("Error: " + errorThrown); }
});
}
});
};
Сторона контроллера
[HttpPost]
public PartialViewResult ResolutionFormDisplay(List<string> trans)
{
var resolutionViewModel = new ResolutionViewModel();
// fill Usernames dropdown selector in ViewModel
// fill Status dropdown selector in ViewModel
// fill list of transactionIds in ViewModel
return PartialView("_ResolutionDialog", resolutionViewModel);
}
РЕШЕНИЕ: Postback в $.ajax не отправлял правильно отформатированные данные в контроллер. Я обнаружил это, используя вкладку сети в IE и глядя на тело запроса POSTed http. Это выглядело так: transaction_table_length = 10 & chkTransaction = 22 & chkTransaction = 23 - Это должно было выглядеть так: {"trans": ["22", "23"]}. Чтобы решить эту проблему, я стягивал имя и массив свойств, как показано ниже, изменил тип dataType на "текст" и сделал параметр в методе действий контроллера взять String [] trans.
JQuery
// Return the selected transactions
function resolveTransactions() {
$('#btnResolve').click(function() {
var selectedTransactions = new Array();
$('input[name="chkTransaction"]:checked').each(function() {
selectedTransactions.push(this.value);
});
if (selectedTransactions.length > 0) {
$.ajax({
type: 'POST',
dataType: 'text',
url: 'http://localhost/AuditLog/Home/ResolutionFormDisplay',
contentType: 'application/json; charset=utf-8',
data: JSON.stringify({ trans:selectedTransactions }),
traditional: true,
success: function (data) { alert(data); },
error: function(xhr, status, errorThrown) { alert(" Error: " + errorThrown); }
});
} else {
alert('You must select (check) at least one transaction to apply a resolution.');
return false;
}
return false;
});
};
Действие контроллера MVC 4
[HttpPost]
public PartialViewResult ResolutionFormDisplay(string[] trans)
{
var resolutionViewModel = new ResolutionViewModel();
// fill Usernames dropdown selector in ViewModel
// fill Status dropdown selector in ViewModel
// fill list of transactionIds in ViewModel
return PartialView("_ResolutionDialog", resolutionViewModel);
}
Попробуйте, чтобы ваш контроллер принял список, а не только одну строку (поскольку вы не передаете одну строку):
[HttpPost]
public PartialViewResult ResolutionFormDisplay(List<string> value)
{
var resolutionViewModel = new ResolutionViewModel();
// fill Usernames dropdown selector in ViewModel
// fill Status dropdown selector in ViewModel
// fill list of transactionIds in ViewModel
return PartialView("_ResolutionDialog", resolutionViewModel);
}
Отправленный JSON должен иметь именованные свойства, соответствующие параметрам в вашем методе контроллера. Проверьте вкладку "сеть" в инструментах Chrome dev и посмотрите, что именно вы публикуете, возможно, это примерно так:
"{\"value\":\"...\"}"
Не существует свойства value
для перехода к параметру value
метода контроллера. Я думаю, что лучше всего было бы просто избавиться от "JSON.stringify" и принять список как ответ Колина, но если вы хотите взять его как строку, строка JSON должна быть значением свойства объекта, а не наоборот:
data: {value : JSON.stringify(selectedTransactions)},
Попробуйте передать свой массив следующим образом:
data:"{'trans':" + JSON.stringify(selectedTransactions)+"}"
Ваш метод должен быть следующим:
public void Method(List<string> trans)
{
//Your implementation
}