Как передать этот массив js на контроллер MVC 3? - PullRequest
9 голосов
/ 13 июня 2011

Я получаю нулевые значения в контроллере. Не уверен, что мне не хватает.

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

Затем я читаю имя и электронную почту выбранных контактов и собираю массив js. Затем этот массив передается в MVC 3 controller.

JS код:

var name ='', email='';
    var guest = new Array();
            var guests = new Array();
            $('.CBC').each(function () {  //loop grid by checkbox class
                if (this.checked) {
                    name = GetSelectedName();
                    email = GetSelectedEmail();
                    guest = { 'Email': email, 'Name': name };
                    guests.push(guest);
                }
            });

        $.ajax({
        type: "POST",
        url: GetURL(),
        data: guests,
        dataType: "json",
        success: function (res) {
           //do something
        }
});

Контроллер:

[HttpPost]
    public ActionResult AddGuests(List<SelectedGuest> guests)
    {            
        GuestService svc = new GuestService();
        //do something with guests
        //But Name and Email of all items in guests are null!!!
    }

public class SelectedGuest
{
    //represent the email columns of the contact grid
    public string Email { get; set; }

    //represent the Name column of the contact grid
    public string Name { get; set; }
}

Нужно ли явно преобразовывать массив js в объект json для его сериализации?

Ответы [ 7 ]

7 голосов
/ 11 июля 2012
$.ajax({
            type: "POST",
            url: "yourUrl",
            data: JSON.stringify(yourArray),
            contentType: "application/json; charset=utf-8"
        });

contentType: "application / json; charset = utf-8" - очень важная часть

[HttpPost]
public void Fake(List<yourType> yourArray)
{
}
4 голосов
/ 13 июня 2011

Возможно, может помочь изменение значения традиционное на истинное.Вот (модифицированный) код, который я использовал для публикации уникальных идентификаторов (Guids) в действии контроллера.

var yourArray = new Array();
// TODO: fill array with ids of checked checkboxes
$('.CBC:checked').each(function () {
   yourArray.push($(this).attr('myId'));
});

var postData = {
    yourArray: yourArray
};

$.ajax({
    type: "POST",
    url: "/ctrl/ActionName",
    data: postData,
    success: function (result) {
    },
    datatype: "json",
    traditional: true
});

В контроллере у меня есть следующее действие.

[HttpPost]
public ActionResult ActionName(List<Guid> yourArray)
{
    return View();
}
3 голосов
/ 13 июня 2011

Если вы можете использовать плагин, попробуйте jQuery-JSON :

var guests = new Array();

// push stuff into the array

$.ajax({
     type: "POST",
     url: GetURL(),
     data: $.toJSON(guests),
     dataType: "json",
     success: function (res) {
        //do something
     }
);
1 голос
/ 06 мая 2016

просто установите 'Traditional: true " в вашем AJAX.

Пример :

 $.ajax({
    type: "POST",
    url: GetURL(),
    data: PostData ,
    dataType: "json",
    traditional:true,
    success: function (res) {
       //do something
    }
});
1 голос
/ 24 июля 2013

Вы получаете ноль, потому что отправляете массив json неверным образом.

Во-первых, вы должны сериализовать ваш массив json:

$.ajax({
        // Whatever ...
        type: "POST",
        url: "yourUrl",
        data: JSON.stringify(guests),
        // Whatever ...
    });

Во-вторых, ваш контроллер должен получить строку:

[HttpPost]
public ActionResult ActionName(string guests)
{
    // ...
}

и, наконец, вы должны десериализовать эту строку в связанный тип:

[HttpPost]
public ActionResult ActionName(string guests)
{
    // this line eserializes guests ...

    IList<GuestType> gs = 
       new JavaScriptSerializer().Deserialize<IList<GuestType>>(guests);

    // ... Do whatever with gs ...

    return View();
}
0 голосов
/ 13 декабря 2014

Я попробовал это, оно работает.

var name ='', email='';
var guest = new Array();
        var guests = new Array();
        $('.CBC').each(function () {  //loop grid by checkbox class
            if (this.checked) {
                name = GetSelectedName();
                email = GetSelectedEmail();
                guest = { 'Email': email, 'Name': name };
                guests.push(guest);
            }
        });

 var PostData = { guests: guests }; //if this is creating ambiguity try using something:guest //(something is //controller parameter, change your controller parameter accordingly)              

    $.ajax({
    type: "POST",
    url: GetURL(),
    data: PostData ,
    dataType: "json",
    success: function (res) {
       //do something
    }
});

Приветствия

Шринивас

0 голосов
/ 29 октября 2011

Вы также можете создать пользовательскую модель переплета.Это позволяет вам написать код, который принимает необработанный ввод из объекта запроса и создает объект из него.Это позволит вам создать список строк или чего-либо еще, что вы хотели бы видеть как объект в вашем контроллере.Это также очень многоразово.

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