我正在开发一个同时使用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)
答案 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对象的方式,但这很痛苦。希望有人可以发表更好的回复。