Модель списка перестает корректно связываться при добавлении параметра запроса - PullRequest
0 голосов
/ 04 октября 2018

Я использую диалоговое окно модального редактора, чтобы пользователь мог изменить список адресов клиентов.Когда клиент хочет добавить или удалить адрес, я обрабатываю его с помощью JQuery, используя запрос AJAX.Несмотря на то, что код в основном вырезан и вставлен с небольшими изменениями, моя функция addAddr() работает, как и ожидалось (контроллер получает список адресов), а моя функция delAddr() не работает (контроллер получает список содин адрес, несмотря на то, что модель содержит несколько адресов.) Кто-нибудь может увидеть ошибку в следующем коде?

Действия контроллера:

[HttpPost]
public async Task<IActionResult> AddCustomerAddress(List<CustomerAddress> Model)
{
    var newAddr = new CustomerAddress
    {
        CustomerID = Model[0].CustomerID,
        IsActive = true,
        IsPrimary = true
    };

    await _dbService.InsertCustomerAddressAsync(newAddr);

    return RedirectToAction(nameof(EditCustomerAddresses), new { Model[0].CustomerID });
}

[HttpPost]
public async Task<IActionResult> DeleteCustomerAddress(List<CustomerAddress> Model, [FromQuery]int Index)
{
    await _dbService.DeleteCustomerAddressAsync(Model[Index]);

    return RedirectToAction(nameof(EditCustomerAddresses), new { Model[0].CustomerID });
}

JQuery:

function addAddr() {
    var model = $('form#addr-editor').serialize();
    $.post('/Customer/AddCustomerAddress',
        model,
        function (data, status, jqXHR) {
            $('#modal-container').html(data);
            $.notify('New Address Activated - Save Changes After Editing', { position: "top-center" });
        }
    ).fail(function () {
        $.notify('Error adding Address.', { position: "top center" });
    });
}

function delAddr(index) {
    var model = $('form#addr-editor').serialize();
    $.post('/Customer/DeleteCustomerAddress?Index=' + index,
        model,
        function (data, status, jqXHR) {
            $('#modal-container').html(data);
            $.notify('Address Deleted Successfully', { position: "top center" });
        }
    ).fail(function () {
        $.notify('Error Deleting Address.', { position: "top center" });
    });
}

Моя тестовая запись имеет шесть адресов.Действие Add получает List<CustomerAddress> с Count = 6.Действие Delete получает индекс правильно, но получает модель как List<CustomerAddress> с Count = 1.Единственное различие, о котором я знаю, - это включение дополнительного параметра в строку запроса.Мое желаемое поведение для обоих действий контроллера, чтобы получить список из 6 адресов.Любая помощь приветствуется!

1 Ответ

0 голосов
/ 04 октября 2018

Я наконец выяснил проблему - похоже, это функция, а не ошибка ... Изменение подписи действия на что-то вроде этого решает проблему:

[HttpPost]
public async Task<IActionResult> DeleteCustomerAddress(List<CustomerAddress> Model, [FromQuery]int NotTheIndex)
{
    await _dbService.DeleteCustomerAddressAsync(Model[NotTheIndex]);

    return RedirectToAction(nameof(EditCustomerAddresses), new { Model[0].CustomerID });
}

Это говорит о том, что Indexявляется зарезервированным именем параметра.Когда я получал одну запись в моем списке, а индекс составлял 2, я фактически получал только Model[2].

Добавление FromForm до того, как Model также решит проблему:

public async Task<IActionResult> DeleteCustomerAddress([FromForm]List<CustomerAddress> Model, [FromQuery]int Index)
...