Ärger-Modell der Bindung eines JSON-array in eine Liste in ASP.NET MVC-3

Ich habe Probleme beim Modell der Bindung eines JSON-array an einer C# - Liste in MVC 3.

Ich habe ein Objekt namens ein DockState. Es sieht wie folgt aus:

[Serializable]
public class DockState
{
    public bool Closed { get; set; }
    public bool Collapsed { get; set; }
    public string DockZoneID { get; set; }
    public int ExpandedHeight { get; set; }
    public Unit Height { get; set; }
    public int Index { get; set; }
    public Unit Left { get; set; }
    public bool Pinned { get; set; }
    public bool Resizable { get; set; }
    public string Tag { get; set; }
    public string Text { get; set; }
    public string Title { get; set; }
    public Unit Top { get; set; }
    public string UniqueName { get; set; }
    public Unit Width { get; set; }
}

Meiner action-Methode akzeptiert eine Liste der dock-Staaten, wie diese:

public JsonResult SaveDockStates(List<DockState> dockStates)

Auf dem client Baue ich ein array von JSON-Objekten, die alle die gleichen Eigenschaften wie das C# DockState Objekt. Ich bin dann die Zuordnung dieses array zu einem JSON-Objekt mit der Eigenschaft des Arguments in der action-Methode, wie folgt aus:

function get_allDockStates()
{
    var allRadDocks = []; //declare array.
    var allRadControls = $telerik.radControls; //use telerik API to obtain all controls.

    //loop through all telerik controls.
    for (var i = 0; i < allRadControls.length; i++)
    {
        var element = allRadControls[i];

        //Check if control is a rad dock element.
        if (Telerik.Web.UI.RadDock && element instanceof Telerik.Web.UI.RadDock)
        {
            //Build a JSON object containing the same properties as the C# DockState
            //object. Leaving out a couple that should just be null anyway. Add new
            //JSON object to array.
            Array.add(allRadDocks,
            {
                UniqueName: element._uniqueName,
                DockZoneID: element._dockZoneID,
                Width: element._width,
                Height: element._height,
                ExpandedHeight: element._expandedHeight,
                Top: element._top,
                Left: element._left,
                Resizable: element._resizable,
                Closed: element._closed,
                Collapsed: element._collapsed,
                Pinned: element._pinned,
                Title: element._title,
                Index: element._index
            });
        }
    }
    //Return the array.
    return allRadDocks;
}

//This function is fired by the rad dock controls when they are moved.
function positionChanged(sender, e)
{
    //obtain the array of dock states.
    var dockStates = get_allDockStates();
    //Make ajax call to MVC action method to save dock states.
    jQuery.ajax({
        data: { dockStates: dockStates },
        type: 'POST',
        dataType: 'json',
        url: '/AjaxServices/DashboardService/SaveDockStates'
    });
}

Leider etwas sehr seltsames passiert, wenn der AJAX-Aufruf gemacht. Es trifft die action-Methode und meine List<DockState> hat Elemente darin.

http://www.codetunnel.com/content/images/dockStateListInstantiated.jpg

Jedoch, die Elemente in der Liste sind alle Standard. Das bedeutet, alle Ihre Werte sind die default Werte, nicht diejenigen, die in der vorgelegten Anfrage.

http://www.codetunnel.com/content/images/dockStatesDefaultValues.jpg

Ich bin nicht sicher, warum die Liste enthält die richtige Anzahl der Elemente, sondern alle Elemente angezeigt werden nichts mehr als instanziiert. Ihre Eigenschaften wurden nicht die Werte im JSON-array. Die Anfrage enthält definitiv die richtigen Daten ein, wie hier gezeigt:

http://www.codetunnel.com/content/images/dockStatesFormData.jpg

Mache ich etwas falsch? Ist die Formular-Daten werden falsch formatiert? Ist es ein problem mit der Standard-Modell-binder?

Update (Prüfung Darin dimitrovs Antwort)

Entdeckte ich, dass die JSON-wurde außer Kraft gesetzt, indem Sie eine ungenutzte alte Skript. Ich habe die entfernt und jetzt JSON.stringify ist in Ordnung. Hier ist die Anfrage-payload.

http://www.codetunnel.com/content/images/dockStatesJsonStringify.jpg

Viel besser. Aber jetzt, wenn ich Debuggen meiner Liste hat keine Elemente. Dies schien nicht das problem zu beheben, aber ich Schätze die Mühe 🙂

InformationsquelleAutor Chev | 2011-08-29
Schreibe einen Kommentar