/ / Wartości obiektów Array nie są dodawane do wywołania ajax - javascript, asp.net-mvc-3, jquery

Wartości obiektów tablicy nie są dodawane do wywołania ajax - javascript, asp.net-mvc-3, jquery

Celem jest rozpoznanie struktury MVCi wypełnij pole w moim działaniu, które jest obiektem FormCollection. Mogę go uruchomić, jeśli sam sobie poradzę z serializacją, ale jak dotąd nie mam kości, jeśli zostawiam to jquery / javascript.

Pytanie: Co powoduje serializację poniższej tablicy, tak jakby nie zawierała żadnych danych?

Sprawdziłem zmienną i zawiera ona jeden element zgodnie z oczekiwaniami (ustawiony w innym miejscu kodu).

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

Problem z tym jest zachowanie tablicy ... jeśli robię alert(formVars); wydaje się pusty, mimo że zawiera wszystkie pary klucz / wartość. Podobnie parametr FormVariables jest pusty po JSON.stringify() wykonuje swoją pracę.

 $.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);
}
});

}

seryjne wyjście:

"{"Req":
{
"SelectedColId":"",
"CurrentPage":1,
"PageSize":15,
"RecordCount":0,
"NumberOfPages":2,
"MultipleSelection":false,
"FormVariables":[]
}
}"

co tu jest nie tak?

EDYCJA: zawartość 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;
}
}

Model, do którego powinien się podłączyć:

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()
{
}
}

Odpowiedzi:

1 dla odpowiedzi № 1

Deklarowałeś formVars zmienna jako tablica i jeszcze tutaj: formVars[item.toString()] próbujesz rozwiązać problem pewną wartością, która prawdopodobnie nie jest liczbą całkowitą. W tablicy javascript muszą być oparte na 0 indeksy całkowite. Więc zamiast:

formVars[item.toString()] = gd["FormVariables"][item];

jeśli chcesz użyć tablicy, potrzebujesz:

formVars.push(gd["FormVariables"][item]);

lub jeśli chcesz zachować element jako klucz:

formVars.push({ key: item, value: gd["FormVariables"][item] });

Jeśli chcesz FormVariables być obiektem (tj. tablicą asocjacyjną w javascript), a następnie:

var formVars = {};
for (var item in gd["FormVariables"])
{
if (gd["FormVariables"][item] != null)
{
formVars[item.toString()] = gd["FormVariables"][item];
}
}

To naprawdę zależy od tego modelu widoku, który próbujesz powiązać z tym po stronie serwera.


AKTUALIZACJA:

Teraz, kiedy opublikowaliście swoje gd zmienna, patrząc na FormVariables własność, wygląda bardzo dziwnie:

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

To zawsze zwróci pustą tablicę, która ogranicza użyteczność takiej struktury.