Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/jquery/70.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# ASP.NET MVC 3中将JSON数组绑定到列表的故障模型_C#_Jquery_Asp.net Mvc_Json_Asp.net Mvc 3 - Fatal编程技术网

C# ASP.NET MVC 3中将JSON数组绑定到列表的故障模型

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;

在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; 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,并用结果更新了我的问题。请求负载看起来好得多,但似乎对模型绑定器没有帮助。