JQuery AJAX вызов действия контроллера, передавая массив значений - PullRequest
0 голосов
/ 26 сентября 2018

Я пытаюсь передать массив значений флажков из формы Ajax в MVC в действие контроллера.Вот мой код:

Форма (в модальном режиме):

@using (Ajax.BeginForm("GetPrintableProject", "Project", null, new AjaxOptions { HttpMethod = "POST"}, new { @id = "PrintProjectFormId"))
 {
 <input type="hidden" name="projectId" id="projectId" value="">

}

Некоторые jQuery, которые получают массив значений флажков:

selectedProjects = projectsGrid.$('input[type="checkbox"]').serializeArray();

var projects = [];

$(selectedProjects).each(function (i, field) {
    projects.push(field.value);
});
//the hidden field in a modal I'm using
$('#projectId').val(projects.toString());

и функция, которую я использую для отправки:

$("#PrintProjectFormId").submit(function (event) {

event.preventDefault();
event.stopImmediatePropagation();

var action = $("#PrintProjectFormId").attr("action");
var dataString = new FormData($("#PrintProjectFormId").get(0));

$.ajax({
   type: "POST",
   url: action,
   data: dataString,
   dataType: "json",
   contentType: false,
   processData: false,
   success: function (result) {
            //stuff I'll get to later
        },
        error: function (jqXHR, textStatus, errorThrown) {
            alert("There was a problem retrieving this project");
        }
        });
    });

, а затем подпись контроллера:

[HttpPost]
public JsonResult GetPrintableProject(Guid[] projectId)

Это прекрасно работает, если я передаю одно значение, но если япередать несколько значений, контроллер просто получает «ноль».Думаю, я упускаю что-то простое здесь.Заранее спасибо.

Ответы [ 3 ]

0 голосов
/ 26 сентября 2018

Я бы предложил не изменять значения параметров по умолчанию, если вам не нужно.Создайте свои параметры как объект JSON и передайте его $.ajax.

из API jQuery для AJAX

processData (по умолчанию: true)

Тип: Boolean

По умолчанию данные, передаваемые в параметр данных в виде объекта (технически, что угодно, кроме строки), будут обрабатываться и преобразовываться в строку запроса, подходя по умолчаниютип содержимого "application / x-www-form-urlencoded".Если вы хотите отправить DOMDocument или другие необработанные данные, установите для этого параметра значение false.

Установка этого значения в значение false приведет к проблемам при попытке передать в действие более одного значения, если толькоВы выполняете обработку в функции контроллера.

var action = $("#PrintProjectFormId").attr("action");

//fill projects array

$.ajax({
  type: "POST",
  url: action,
  data: {
    projectId: $("#PrintProjectFormId").val(),
    "projects": projects
  },
  success: function(result) {
    //stuff I'll get to later
  },
  error: function(jqXHR, textStatus, errorThrown) {
    alert("There was a problem retrieving this project");
  }
});
0 голосов
/ 27 сентября 2018

Поскольку вы передаете не класс, а массив, строка данных должна выглядеть следующим образом:

   type: "POST",
   url: action, 
   data:
      [
        "6ccf7071-9b73-4e61-8736-58a842c131d0",
        "9e6c2748-18b5-4a53-a306-eb539c8b7dee",
        "5aa8901a-2c03-42d3-bf06-89f66e3797a4",
        "da5556bf-32aa-4f41-a64a-6e95fa2595c1"
      ],

Также попробуйте добавить FromBody в ActionMethod, например:

[HttpPost]
public JsonResult GetPrintableProject([FromBody]Guid[] projectId)
0 голосов
/ 26 сентября 2018

Пожалуйста, попробуйте это:

 type: "POST",
   url: action, 
   data: {dataString:dataString, dataString1:dataString2, dataString2:dataString2},

Формат: индекс: значение

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...