Модель неполадок, связывающая массив JSON со списком в ASP.NET MVC 3 - PullRequest
3 голосов
/ 29 августа 2011

У меня проблема с привязкой модели JSON к списку C # в MVC 3.

У меня есть объект с именем DockState. Это выглядит так:

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

Мой метод действия принимает список состояний дока, например:

public JsonResult SaveDockStates(List<DockState> dockStates)

На клиенте я создаю массив объектов JSON, которые содержат все те же свойства, что и объект C # DockState. Затем я назначаю этот массив собственному объекту JSON со свойством аргумента в методе действия, например:

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

К сожалению, при вызове AJAX происходит нечто странное. Он поражает метод действия, и у моего List<DockState> есть предметы.

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

Тем не менее, элементы в списке все по умолчанию. То есть все их значения являются значениями по умолчанию, а не теми, которые представлены в запросе.

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

Я не уверен, почему список содержит правильное количество элементов, но все элементы кажутся не более чем экземплярами. Их свойства не были установлены в значения в массиве JSON. Запрос определенно содержит правильные данные, как показано здесь:

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

Я что-то не так делаю? Данные формы отформатированы неправильно? Есть ли проблема с подшивкой модели по умолчанию?

Обновление (тестирование ответа Дарина Димитрова)

Я обнаружил, что JSON переопределяется неиспользованным старым скриптом. Я удалил и теперь JSON.stringify работает нормально. Вот полезная нагрузка запроса.

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

Намного лучше. Однако теперь, когда я отлаживаю, мой список содержит ноль элементов. Это, похоже, не решило проблему, хотя я ценю усилия :) 1040 *

1 Ответ

14 голосов
/ 29 августа 2011

Попробуйте отправить запрос JSON:

jQuery.ajax({
    // TODO: Never hardcode urls like this => always use URL helpers
    // when you want to generate an url in an ASP.NET MVC application
    url: '/AjaxServices/DashboardService/SaveDockStates',
    type: 'POST',
    data: JSON.stringify({ dockStates: dockStates }),
    contentType: 'application/json; charset=utf-8',
    success: function(result) {
        // TODO: process the results
    }
});

Метод JSON.stringify изначально встроен в современные браузеры. Если вы хотите поддерживать устаревшие браузеры, вам нужно включить скрипт json2.js на свою страницу.

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