Передача массива через Ajax в действие MVC

#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), , чтобы передать массив из js

2. @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) это, что показывает отладчик, извините