У меня проблема с привязкой модели 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 *