数组对象值未添加到ajax调用

时间:2011-09-26 18:35:16

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

这里的目标是让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()
    {           
    }
}

1 个答案:

答案 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;
}

这将始终返回一个空数组,这限制了此类结构的有用性。