0

我正在开发一个同时使用 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)
4

1 回答 1

0

查看传递给 MVC 引擎的数据表明该对象正在以 JavaScript 方式序列化。即,对象看起来像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 对象的方式,但这很痛苦。希望有人可以发表更好的回应。

于 2012-08-17T16:52:58.500 回答