如何将此js数组传递给我的MVC 3控制器?

问题描述

| 我在控制器中得到空值。不知道我在想什么。 我有一个网格,其中有一个来宾列表(带有名称和电子邮件),用户可以通过复选框选择来宾。 然后,我读取所选联系人的姓名和电子邮件并构建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对象以对其进行序列化?     

解决方法

        
$.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)
{
}
    ,        也许将传统设置更改为true可能会有所帮助。这是我用来将唯一标识符(Guid)发布到控制器操作的(修改的)代码。
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();
}
    ,        如果您有使用插件的自由,请尝试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
     }
);
    ,        由于您以错误的方式发送json数组,因此会得到null。 首先,您应该序列化json数组:
$.ajax({
        // Whatever ...
        type: \"POST\",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();
}
    ,        只需在ajax中设置\'traditional:true \”即可。 范例:
 $.ajax({
    type: \"POST\",data: PostData,traditional:true,success: function (res) {
       //do something
    }
});
    ,        您还可以创建自定义模型活页夹。这使您可以编写将原始输入从请求对象中取出并从中创建对象的代码。这样,您就可以创建字符串列表或您希望在控制器中看到的任何其他对象。这也是非常可重用的。     ,        我尝试了这个,它的工作。
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\",success: function (res) {
       //do something
    }
});
干杯, 斯里尼瓦斯