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 № 1Deklarował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.