C# ASP.NET MVC 3中将JSON数组绑定到列表的故障模型
在MVC3中,我很难将JSON数组绑定到C#列表 我有一个名为C# ASP.NET MVC 3中将JSON数组绑定到列表的故障模型,c#,jquery,asp.net-mvc,json,asp.net-mvc-3,C#,Jquery,Asp.net Mvc,Json,Asp.net Mvc 3,在MVC3中,我很难将JSON数组绑定到C#列表 我有一个名为DockState的对象。看起来是这样的: [Serializable] public class DockState { public bool Closed { get; set; } public bool Collapsed { get; set; } public string DockZoneID { get; set; } public int ExpandedHeight { get;
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)
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'
});
}
我的操作方法接受停靠状态列表,如下所示:
[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)
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调用时发生了一些非常奇怪的事情。它点击操作方法,我的列表中确实有项目
但是,列表中的项目都是默认的。这意味着它们的所有值都是默认值,而不是请求中提交的值
我不确定为什么列表中包含正确数量的项,但所有项看起来都只是实例化的。它们的属性未设置为JSON数组中的值。请求肯定包含正确的数据,如下所示:
我做错什么了吗?表单数据的格式是否不正确?默认模型活页夹有问题吗
更新(测试Darin Dimitrov的答案)
我发现JSON被一个未使用的旧脚本覆盖。我已经删除了JSON,现在stringify可以正常工作了。这是请求负载
好多了。但是,现在当我调试时,我的列表中没有任何项。这似乎并没有解决问题,但我很感谢您的努力:)尝试发送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
方法本机内置于现代浏览器中。如果您想支持传统浏览器,则需要将脚本包含到页面中。@Alex Ford,您的请求负载完全混乱。你从哪里得到这个JSON.stringify
函数的?删除它并尝试使用内置于现代浏览器中的一个。@Alex Ford,我在回答中提供了一个链接:。但正如我所说的:在现代浏览器中进行第一次没有它的测试=>。就url而言,正如我所说的,url应该始终由助手生成。@Alex Ford,你使用的是什么浏览器?如果你使用的是最新版本的Chrome,这是不可能的。它内置了JSON.stringify方法。确保您没有在某个地方覆盖它。我不能在web表单中使用mvc帮助程序…可以吗?好的,我修复了JSON.stringify,并用结果更新了我的问题。请求负载看起来好得多,但似乎对模型绑定器没有帮助。