Отправка массива строк в .net-core mvc

Проблема:

Я пытаюсь отправить массив строк через сообщение jquery, но они не анализируются правильно, все, что я получаю, - это null в списке.

javascript:

var array = [];
array.push("test")
array.push("test2")
array.push("tes3")

$.post("Admin/FilteredKeys", $.param(JSON.stringify({ Ids: array, OnlyActive: true }, true)));

Модель C#:

public class MySearch
{
    public bool OnlyActive { get; set; } = true;
    public List<string> Ids { get; set; }
}

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

public async Task<IActionResult> FilteredKeys(MySearch filter)
{
    var data = await _service.GetFilteredKeyTypes(filter);
    return View();
}

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

$.ajax({
    type: "POST",
    url: "Admin/FilteredKeys",
    data: postData,
    success: function(data){
        alert(data.Result);
    },
    dataType: "json",
    traditional: true
});

Это основной проект .net, мне нужно где-то изменить дополнительные параметры?

Обновлено:

забыл добавить, что моя первоначальная попытка была такой:

$.Admin.worker.postJson("Admin/FilteredKeys", JSON.stringify({ Ids: array, OnlyActive: true }), function (data) {
    var t = "";
});

postJson: function (url, data, callback) {
    $.LoadingOverlay("show");
    $.ajax({
        url: url,
        type: 'POST',
        data: data,
        contentType: 'application/json; charset=utf-8',
        success: function (data) {
            if (callback)
                callback(data);
            $.LoadingOverlay("hide");
        },
        error: function (event, jqxhr, settings, thrownError) {
            //$.helpers.errorHandler($("#fileDialogErrors"), event.responseText);
            $.LoadingOverlay("hide");
        }
    });
}

Не тестировал, но я бы посоветовал использовать data: { filter : postData } в ajax, так как столкнулся с подобными проблемами и решил их.

Hikarunomemory 10.04.2018 15:24

Мое скрытое подозрение связано с тем, где вы параметризуете строковый объект: $.param(JSON.stringify({ Ids: array, OnlyActive: true }. Вы просто пробовали опубликовать сам объект в качестве данных публикации? например { Ids: array, OnlyActive: true }

Geoff James 10.04.2018 15:25
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
3
2
739
5
Перейти к ответу Данный вопрос помечен как решенный

Ответы 5

Почему не только это:

  $.post("Admin/FilteredKeys",{ Ids: JSON.stringify(array), OnlyActive: true });

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

Geoff James 10.04.2018 15:26

просто базовый пост на url с параметрами, установленными в фигурных скобках

Keith 10.04.2018 15:27

@Keith, я знаю это. Возможно, я не понял. Я имел в виду, что если бы было объяснено, что Зачем работает существующий код не, и чем он отличается, это сделало бы ответ намного более полным и понятным для всех пользователей.

Geoff James 10.04.2018 15:29

Он объединит весь массив в одну строку. Итак, в JSON.stringify(array) нет необходимости, только Ids: array.

SᴇM 10.04.2018 15:30

Это один из тех вопросов, которые я только что вытащил из головы и спрашиваю, почему JSON.stringify не проанализировал его «правильно» при синтаксическом анализе всего объекта? Это отлично работает

ThunD3eR 10.04.2018 15:32

@Manoj Я проголосовал против, потому что ваше решение вернется к непустому объекту контроллера, но для списка Ids он получит один элемент с сериализованной строкой json фактического массива, и я не думаю, что это правильное решение.

SᴇM 10.04.2018 15:54

@SeM - по той же причине, за которую я еще не проголосовал. Я считаю, что было бы несправедливо голосовать против - по крайней мере, ответ на правильный путь. Но я согласен: этот ответ должен просто передать array как значение Ids, а не сериализовать его, что пока делает его не совсем правильным.

Geoff James 10.04.2018 16:04

Также убедитесь, что контроллер пытается разобрать модель из тела, вы можете добавить атрибут FromBody:

public async Task<IActionResult> FilteredKeys([FromBody] MySearch filter)
{
...
}

Также вы должны добавить в свой запрос тип содержимого application / json:

$.ajax({
    type: "POST",
    url: ...,
    data: ...,
    success: ...
    contentType: "application/json"
});
 $.ajax({
        type: "POST",
        url: "Admin/FilteredKeys",
        data: { filter: postData},
        success: function(data){
            alert(data.Result);
        },
        dataType: "json",
        traditional: true
    });

Как правило, ответы гораздо более полезны, если они включают объяснение того, для чего предназначен код, и почему это решает проблему, не вводя других.

Neuron 10.04.2018 17:30

@LonelyNeuron Спасибо за ваш совет.

Emir Cangır 11.04.2018 13:21
Ответ принят как подходящий

Поскольку я считаю, что принятый ответ неверен - вот альтернативный (аналогичный, но не такой, как другие ответы здесь). Для начала нужно украсить модель атрибутом FromBody:

public async Task<IActionResult> FilteredKeys([FromBody] MySearch filter)
{
    var data = await _service.GetFilteredKeyTypes(filter);
    return View();
}

И вызов ajax должен выглядеть так:

var array = [];
array.push("test")
array.push("test2")
array.push("test3")
 $.ajax({
    type: "POST",
    url: "Admin/FilteredKeys",
    data: JSON.stringify({ Ids: array, OnlyActive: true}),
    contentType: "application/json; charset=utf-8",
    success: function(data){
        // ...
    },
    failure: function(errMsg) {
        // ...
    }
});

Этот ответ дан в качестве альтернативы (если кто-то предпочтет это решение):

$.post("Admin/FilteredKeys", { Ids: array, OnlyActive: true });

Другие вопросы по теме