Не удается отправить массив из jQuery на контроллер MVC 4

0

Я искал это и проверял все 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);
}
  • 0
    Я также вижу ошибку в окне предупреждения об ошибке, которая говорит [объект объекта]
  • 0
    Просто обратите внимание, что обратный вызов ошибки принимает 3 параметра в следующем порядке: xhr, status, errorThrown, так что я бы изменил ваш обработчик ошибок, поэтому передайте эти параметры и предупредите об этом вместо xhr, который будет преобразован в строку, просто покажет [ объект Объект], как вы заметили.
Показать ещё 4 комментария
Теги:
arrays
asp.net-mvc

4 ответа

0
Лучший ответ

РЕШЕНИЕ: 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);
}
2

Попробуйте, чтобы ваш контроллер принял список, а не только одну строку (поскольку вы не передаете одну строку):

[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);
}
  • 0
    Я сделал изменения Колин и не было никакой разницы после перезапуска. Спасибо за предложение, хотя.
1

Отправленный JSON должен иметь именованные свойства, соответствующие параметрам в вашем методе контроллера. Проверьте вкладку "сеть" в инструментах Chrome dev и посмотрите, что именно вы публикуете, возможно, это примерно так:

"{\"value\":\"...\"}"

Не существует свойства value для перехода к параметру value метода контроллера. Я думаю, что лучше всего было бы просто избавиться от "JSON.stringify" и принять список как ответ Колина, но если вы хотите взять его как строку, строка JSON должна быть значением свойства объекта, а не наоборот:

data: {value : JSON.stringify(selectedTransactions)},
  • 0
    Я избавился от JSON.Stringify и изменил подпись на List <string>, но без изменений в поведении. Пробовал Goggle Chrome Network вкладка и форма данных в заголовках выводит список данных.
  • 0
    Джейсон, данные в Google Chrome перечислены следующим образом :action_table_length = 10 & chkTransaction = 22 & chkTransaction = 23 & chkTransaction = 24 & chkTransaction = 25 & chkTransaction = 26 & chkTransaction = 27 & chkTransaction = 28 & chkTransaction = 29 & chkTransaction = 30 & chkTransaction = 30 & chkTransaction = 30 & chkTransaction = 30 & chkTransaction = 30 & chkTransaction = 30 & chkTransaction = 30 & ChkTransaction
0

Попробуйте передать свой массив следующим образом:

data:"{'trans':" + JSON.stringify(selectedTransactions)+"}"

Ваш метод должен быть следующим:

 public void Method(List<string> trans)
{
    //Your implementation
}
  • 0
    Извините, это не имело никакого эффекта.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню