Массив JS int для контроллера MVC3 - PullRequest
8 голосов
/ 27 ноября 2011

У меня есть массив строк в JS.Все члены на самом деле являются числами.
У моего контроллера есть параметр int [].

Я отправляю его из jquery:

$.ajax({url: someUrl, data: {ids : JSON.stringify(id_array) }, ...)

и получаю его с помощью

public ActionResult MyAction(int[] ids) { ...

Параметр не заполняется, я проверил, Request.Form["ids"] содержит "[\"25\",\"26\"]", строковое представление массива JSON. Есть ли способ сделать это автоматически без много разбора int?

Ответы [ 4 ]

11 голосов
/ 27 ноября 2011

Для MVC3 вам необходимо настроить jQuery для использования традиционной «мелкой» сериализации. См. здесь .

AJAX-запрос на стороне клиента:

jQuery.ajaxSettings.traditional = true; //enable "shallow" serialisation globally
$.get("someUrl", {ids : id_array });

Метод действия:

public ActionResult MyAction(string[] ids) { ... }
11 голосов
/ 27 ноября 2011

Вы пытались не разбивать массив на массивы и позволять привязке модели по умолчанию для mvc делать магию

$.ajax({url: someUrl, data: {ids : id_array }, ...)

Я почти уверен. Net MVC увидит массив и увидит, что это массив целых и картаэто к вашему массиву целых правильно

4 голосов
/ 27 ноября 2011

Вы можете сделать это двумя разными способами

1.Используйте $ .ajax для публикации данных в вашем действии

$.ajax({
    url: '/myController/myAction',
    dataType: 'json',
    type: 'POST',
    contentType: 'application/json; charset=utf-8',
    traditional: true,
    data: $.toJSON(json),
    success: function (data, textStatus, jqXHR) {
    ...
    }
});

Ваше действие должно выглядеть следующим образом

public class myController
{
    [HttpPost]
    public ActionResult myAction(List<int> json)
    {
        ....
    }
}

2.Используйте $ .post для публикации ваших данных

$.post(
    '/myController/myAction',
    { json: $.toJSON(products) },
    function (data) {
    ...
});

В вашем действии вы должны десериализовать строку JSON

public class myController
    {
    public ActionResult myAction(string json)
    {
        JavaScriptSerializer serializer = new JavaScriptSerializer();
        List<int> list = serializer.Deserialize<List<int>>(json);
    }
}

Вам необходимо скачать и включить jquery.json-2.2.min.js к вашему коду.

http://code.google.com/p/jquery-json/downloads/detail?name=jquery.json-2.2.min.js

0 голосов
/ 27 ноября 2011

Вам необходимо использовать

$.ajax({
    url: someUrl, 
    data: id_array.map( function(item){ return {name:'ids',value:item}; })
})

Это потому, что для получения списка на бэкэнде необходимо отправить данные в виде ids=3&ids=5&ids=1&ids=7


Для версий IE, которые не поддерживают .map, используйте

function arrayToParamObject(name,array){
    var obj = [];
    for (var i = 0, len = array.length; i< len; i++){
        obj.push( {name: name, value: array[i] } );
    }
    return obj;
}

и используйте его

$.ajax({
    url: someUrl, 
    data: arrayToParamObject('ids', id_array)
})
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...