Значения объекта массива не добавляются в вызов ajax - PullRequest
0 голосов
/ 26 сентября 2011

Цель в том, чтобы инфраструктура 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);, он будет пустым, даже если он содержит все пары ключ / значение. Аналогично, параметр FormVariables становится пустым после того, как JSON.stringify() выполнит свою работу.

 $.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":[]
     }
}'

что здесь происходит не так?

РЕДАКТИРОВАТЬ: содержание БД

{
      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 Ответ

1 голос
/ 26 сентября 2011

Вы объявили переменную formVars как массив, но здесь: 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];
    }
}

Это действительно зависит от того, какую модель представления вы пытаетесь связать это на стороне сервера.


UPDATE:

Теперь, когда вы разместили переменную gd, глядя на свойство FormVariables, она выглядит очень странно:

FormVariables: function() {
    if (this.array == 'undefined') {
        this.array = [];
    } 
    return this.array;
}

Это всегда будет возвращать пустой массив, который ограничивает полезность такой структуры.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...