Сборка и привязка коллекции JSON к параметрам действия контроллера с использованием AJAX - PullRequest
0 голосов
/ 22 апреля 2020

Есть много подобных вопросов, но я не могу найти, что я делаю неправильно в моем конкретном случае c. Я пытаюсь создать коллекцию объектов JSON и привязать ее к параметру действия моего контроллера.

В данный момент я пытаюсь только привязать свойство Name к списку. Единственная проблема, о которой я могу думать, может быть моей JSON структурой коллекции.

AJAX:

function GetFilteredDatatablesValues() {
    var data = {
        Columns: []
    };

    for (var i = 0; i < 5; i++) {
        var column = {
            Name: "name" + i
        };
        data.Columns.push(column);
    }

    data = JSON.stringify(data);

    $.ajax({
        url: '/Client/DatatablesSearchTest',
        type: 'POST',
        contentType: "application/json; charset=utf-8",
        dataType: 'json',
        data: data,
        error: function (response) {

        },
        success: function (data) {

        }
    });
}

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

public JsonResult DatatablesSearchTest(List<DataTableColumn> Columns) //Columns contains 0 items
{
    List<DataTableColumn> test = Columns;

    return Json(new { success = true });
}

Модель:

public class DataTableColumn
{
    public int Data { get; set; }
    public string Name { get; set; }
    public bool Orderable { get; set; }
    public bool Searchable { get; set; }
    public Search Search { get; set; }
    public DataTableColumn()
    {
        Search = new Search();
    }
}

Ответы [ 2 ]

1 голос
/ 22 апреля 2020

Данные, которые вы отправляете, выглядят так:

{
    Columns: [
        { column 1 },
        { column 2 }
    ]
}

Но данные, которые ожидает контроллер, выглядят так:

[
    { column 1 },
    { column 2 }
]

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

[HttpPost]
public JsonResult DatatablesSearchTest(SearchModel model)
{
    List<DataTableColumn> test = model.Columns;
    return Json(new { success = true });
}
public class SearchModel
{
    List<DataTableColumn> Columns { get; set; }
}
0 голосов
/ 22 апреля 2020

Я подтверждаю, что ваш код хорошо работает для .Net Framework, но не для .netcore:

Простое решение для устранения проблемы:

1: поместите свойство List<DataTableColumn> Columns в RootModel:

public class RootModel
{
    public List<DataTableColumn> Columns { get; set; }
}

2: изменить подпись действия, добавив [FromBody]RootModel rootModel как параметр:

public JsonResult DatatablesSearchTest([FromBody]RootModel rootModel) //Columns contains 0 items
{
    //List<DataTableColumn> test = Columns;

    return Json(new { success = true });
}

Обратите внимание, что без [FromBody] will даст вам нулевой объект.

Надеюсь, это поможет вам решить проблему.

...