JSON数据未使用MVC3正确反序列化

时间:2012-07-24 19:44:04

标签: javascript .net asp.net-mvc-3 jquery-mobile

我正在开发一个同时使用jQuery Mobile和MVC3后端的项目。在其中一个页面上,要求用户从几个下拉菜单中选择选项或将其保留为默认值。该页面将获取所选选项并将它们引入一个对象,然后该对象将发送到服务器以加载下一页数据。我尝试了两种不同的方法,两种方式都给出了同样的错误。主对象正确序列化和反序列化,但内部数组没有。该数组具有正确数量的元素,但其中没有数据。我像这样创建对象:

var obj = { };
obj.selections = new Array();
// customArr holds the data from the select lists and populates fine
$.each(customArr, function(key, value)
{
    if(value== undefined)
       return true;

    obj.selections.push({
        type: value.id,
        subtype: value.subtype,
        model: value.model
    });
}

// Selected comes from data that was previously gathered
if(selected != undefined)
{
    obj.mk = selected.mk;
    obj.md = selected.md;
    obj.yr = selected.yr;
}
obj.id = selectionID;

我尝试了两种获取数据的方法。我试图直接移动页面:

$.mobile.changePage('/Select/Data/', { data: obj });

我尝试在没有任何数据的情况下加载上面的页面(仅使用超链接上的jQuery Mobile数据属性),然后使用以下内容为数据添加ajax:

$.ajax({
    url: '/Select/Data/',
    data: obj,
    type: 'POST',
    datatype: 'json',
    error: function() { // Handle error },
    success: function(response) {
        // Load data
    }
});

如果我在服务器代码中设置断点,我可以查看返回的对象。将填充mk,md和yr属性,并且selections数组具有两个对象,但类型,子类型和模型数据为空。但是,如果我单步执行JavaScript代码,它就会完全按照我的预期创建。 POST变量甚至看起来正确,发送到服务器。有什么建议吗?

编辑:C#对象如下所示:

public class ObjectModel
{
    public int mk;
    public int md;
    public int yr;
    public List<Mod> selections;
}
public class Mod
{
    public int type;
    public int subtype;
    public string model;
}

,控制器方法如下所示:

public ActionResult Data(ObjectModel objMod, int id = -1)

1 个答案:

答案 0 :(得分:0)

查看传递给MVC引擎的数据显示该对象正在JavaScript fasion中进行序列化。即,对象看起来像Obj[0]["id"]=5&Obj[0]["name"]="Bob"&Obj[1]["id"]=7&Obj[1]["name"]="Joe"。 MVC显然很难将这种对象表示法反序列化。我的解决方案是创建一个简单的正则表达式字符串替换方法,该方法接受创建的字符串jQuery,然后将其替换为MVC正在寻找的内容。正则表达式查找][模式,因为这只会在每个对象的一个​​位置发生,并用.替换它。然后它查找.".+"]并用空字符串替换最后一个字符。查询字符串最终看起来像Obj[0].id=5&Obj[0].name="Bob"&Obj[1].id=7&Obj[1].name="Joe"。 MVC正确地能够解释这个字符串。我不知道这是MVC的错误还是jQuery序列化JS对象的方式,但这很痛苦。希望有人可以发表更好的回复。