#c# #jquery #asp.net #ajax #asp.net-core-mvc
#c# #jquery #asp.net #ajax #asp.net-core-mvc
Вопрос:
У меня есть следующий код для моего действия контроллера
[HttpPost]
public async Task<IActionResult> MonthsToAdd(List<string> months)
{
}
Мой код ajax выглядит следующим образом
$("#btnSave").on("click", function () {
var months= [];
var value = $("input[name=monthsAvailable]:checked").val()
var lengths = $("input[value=" value "]").closest(".row").index()
console.log($("input[value=" value "]").closest(".row").index())
for (var i = 0; i <= lengths; i ) {
months.push($(".outer .row:eq(" i ") input:radio").val())
}
console.log(JSON.stringify(months));
$.ajax({
contentType: 'application/json;',
dataType: 'json',
type: 'POST',
url: '/AreaName/Controller/MonthsToAdd',
data: JSON.stringify({ 'months': months}),
success: function (response) {
alert("success.");
}
});
});
В консоли браузера я вижу все правильные параметры, но действие MVC не получает параметры. array.count shows 0
. Что я здесь пропустил?
Комментарии:
1. При
{ 'months': months}
этом вы передаете объект, который содержитmonths
свойства as. Но ваш контроллер принимаетList
, поэтому изменитеdata: JSON.stringify(months),
, чтобы передать массив из js2. @user1672994 Спасибо, я тоже это пробовал, все то же самое
3. Это приложение MVC или Razor pages?
4. Я добавил соответствующий тег
5. Итак, это . NET core-mvc не razor-страницы, я снова обновил теги
Ответ №1:
Это то, что сработало с моей стороны:
Метод ajax jQuery:
$.ajax({
contentType: "application/json; charset=utf-8",
dataType: 'json',
type: 'POST',
url: '@Url.Action("MonthsToAdd")',
data: JSON.stringify(months),
success: function (response) {
alert("success.");
}
});
Действие контроллера:
[HttpPost]
public async Task<IActionResult> MonthsToAdd([FromBody] List<string> months)
{
// Add [FromBody]
}
Комментарии:
1. @kukamuk Я действительно рад, что смог вам помочь!
2. Хороший ответ! Почему именно
[FromBody]
атрибут имеет значение? Я спрашиваю, потому что в настоящее время я работаю над большим mvc api, и[FromBody]
его нигде не видно.3. @ShaiCohen Это необходимо для работы model binder в .net core (я думаю, 2.0 или более поздней версии). Действительно хорошую статью на эту тему можно найти здесь .
4. «что вы могли ранее сделать в ASP.NET 4/MVC 5.» … Я покажу себя динозавром.
Ответ №2:
Измените сигнатуру метода контроллера, чтобы принять string[]
вместо List<string>
:
public async Task<IActionResult> MonthsToAdd(string[] months)
Javascript отправляет массив, а не тип List<string>
.NET.
Комментарии:
1. Я уверен, что я тоже это пробовал, позвольте мне попробовать еще раз
2. да, он все тот же
string[] months
, не получает параметры, которые я получаюmonth - {string[0]
3. Что значит «я получаю month — {string[0]». Мы обсуждаем программное обеспечение, которое требует кратких ответов, чтобы избежать недоразумений. Пожалуйста, будьте более конкретны.
4. о, извините, я пытался показать вам, когда я делаю точку останова и наведите курсор
months
наpublic async Task<IActionResult> MonthsToAdd(string[] months)
это, что показывает отладчик, извините