Проблема:
Я пытаюсь отправить массив строк через сообщение 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");
}
});
}
Мое скрытое подозрение связано с тем, где вы параметризуете строковый объект: $.param(JSON.stringify({ Ids: array, OnlyActive: true }. Вы просто пробовали опубликовать сам объект в качестве данных публикации? например { Ids: array, OnlyActive: true }





Почему не только это:
$.post("Admin/FilteredKeys",{ Ids: JSON.stringify(array), OnlyActive: true });
Я думал так же, Манодж :) Единственное, что я могу сказать, это принесет пользу всем, если ты немного объяснишь свой ответ.
просто базовый пост на url с параметрами, установленными в фигурных скобках
@Keith, я знаю это. Возможно, я не понял. Я имел в виду, что если бы было объяснено, что Зачем работает существующий код не, и чем он отличается, это сделало бы ответ намного более полным и понятным для всех пользователей.
Он объединит весь массив в одну строку. Итак, в JSON.stringify(array) нет необходимости, только Ids: array.
Это один из тех вопросов, которые я только что вытащил из головы и спрашиваю, почему JSON.stringify не проанализировал его «правильно» при синтаксическом анализе всего объекта? Это отлично работает
@Manoj Я проголосовал против, потому что ваше решение вернется к непустому объекту контроллера, но для списка Ids он получит один элемент с сериализованной строкой json фактического массива, и я не думаю, что это правильное решение.
@SeM - по той же причине, за которую я еще не проголосовал. Я считаю, что было бы несправедливо голосовать против - по крайней мере, ответ на правильный путь. Но я согласен: этот ответ должен просто передать array как значение Ids, а не сериализовать его, что пока делает его не совсем правильным.
Также убедитесь, что контроллер пытается разобрать модель из тела, вы можете добавить атрибут 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
});
Как правило, ответы гораздо более полезны, если они включают объяснение того, для чего предназначен код, и почему это решает проблему, не вводя других.
@LonelyNeuron Спасибо за ваш совет.
Поскольку я считаю, что принятый ответ неверен - вот альтернативный (аналогичный, но не такой, как другие ответы здесь). Для начала нужно украсить модель атрибутом 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 });
Не тестировал, но я бы посоветовал использовать
data: { filter : postData }в ajax, так как столкнулся с подобными проблемами и решил их.