这里的目标是让MVC框架识别并填充我的动作中的一个字段,即FormCollection对象。如果我自己处理所有的序列化,我可以让它工作,但到目前为止,如果我把它留给jquery / javascript,没有骰子。
问题:是什么导致以下数组被序列化,就像它不包含数据一样?
我检查了变量,它包含了一个与预期一样的项目(在代码中的其他位置设置)。
var formVars = new Array();
for (var item in gd["FormVariables"])
{
if (gd["FormVariables"][item] != null)
{
formVars[item.toString()] = gd["FormVariables"][item];
}
}
var args = {
Req: {
SelectedColId: gd["SelectedColId"],
CurrentPage: gd["CurrentPage"],
PageSize: gd["PageSize"],
RecordCount: gd["RecordCount"],
NumberOfPages: numOfPages,
MultipleSelection: gd["MultipleSelection"],
FormVariables: formVars
}
};
这个问题就是数组的行为......如果我做alert(formVars);
,它就会显示为空,即使它包含所有的键/值对。同样,在JSON.stringify()
完成其工作后,FormVariables参数为空。
$.ajax(
{
traditional: true,
type: 'POST',
contentType: 'application/json',
dataType: 'json',
url: gd["Route"],
data: JSON.stringify(args),
success: function (data, textStatus, jqXHR)
{
},
error: function (jq, status, err)
{
alert(status);
}
});
}
序列化输出:
'{"Req":
{
"SelectedColId":"",
"CurrentPage":1,
"PageSize":15,
"RecordCount":0,
"NumberOfPages":2,
"MultipleSelection":false,
"FormVariables":[]
}
}'
这里出了什么问题?
编辑:gd内容
{
Height: 300,
FetchType: 1,
Route: '../GetTrainingDocuments/',
SelectedColId: '',
PageSize: 15,
CurrentPage: 1,
RecordCount: 0,
HasMoreRecords: true,
NumberOfPages: 1,
MultipleSelection: false,
FormVariables: function()
{
if (this.array == 'undefined')
{
this.array = [];
}
return this.array;
}
}
它应绑定的模型:
public ActionResult GetTrainingDocuments(GridRequest req)
{
//...
}
public class GridRequest
{
public string SelectedColId { get; set; }
public int CurrentPage { get; set; }
public int PageSize { get; set; }
public int RecordCount { get; set; }
public int NumberOfPages { get; set; }
public string Widths { get; set; }
public bool MultipleSelection { get; set; }
public FormCollection FormVariables { get; set; }
public GridRequest()
{
}
}
答案 0 :(得分:1)
您已将formVars
变量声明为数组a formVars[item.toString()]
您试图通过某个可能不是整数的值来解决它。在javascript数组中必须有0个基于整数的索引。所以而不是:
formVars[item.toString()] = gd["FormVariables"][item];
如果你想使用你需要的数组:
formVars.push(gd["FormVariables"][item]);
或者如果您想将项目保留为关键字:
formVars.push({ key: item, value: gd["FormVariables"][item] });
如果你想让FormVariables
成为一个对象(即javascript中的一个关联数组),那么:
var formVars = {};
for (var item in gd["FormVariables"])
{
if (gd["FormVariables"][item] != null)
{
formVars[item.toString()] = gd["FormVariables"][item];
}
}
这实际上取决于您尝试在服务器端绑定它的视图模型。
更新:
现在您已发布gd
变量,查看FormVariables
属性,看起来很奇怪:
FormVariables: function() {
if (this.array == 'undefined') {
this.array = [];
}
return this.array;
}
这将始终返回一个空数组,这限制了此类结构的有用性。