C# 使用json传递小部件数据并保存到数据库

C# 使用json传递小部件数据并保存到数据库,c#,jquery,asp.net,sql-server,json,C#,Jquery,Asp.net,Sql Server,Json,我刚刚又回到这个需求上来,因为当时我被拉离它去做更重要的需求 我问了一个类似的问题,答案很有帮助。然而,在这个问题上,我传递了测试数据并将其保存到数据库中。但是,我不知道如何保存实际的小部件信息。这个链接帮助我成功地传递了json 我在尝试保存数据时收到此消息 jQuery 处理者 Widgets数据类 但是,我现在在插入数据库时遇到这个错误。 我可以看到我的foreach计数是11,但是每个项目的折叠、SortNo、ColumnId和Title都是空的 问题似乎在于c#数据契约中指定的属性名

我刚刚又回到这个需求上来,因为当时我被拉离它去做更重要的需求

我问了一个类似的问题,答案很有帮助。然而,在这个问题上,我传递了测试数据并将其保存到数据库中。但是,我不知道如何保存实际的小部件信息。这个链接帮助我成功地传递了json

我在尝试保存数据时收到此消息

jQuery

处理者

Widgets数据类

但是,我现在在插入数据库时遇到这个错误。


我可以看到我的foreach计数是11,但是每个项目的折叠、SortNo、ColumnId和Title都是空的

问题似乎在于c#数据契约中指定的属性名称与生成的JSON中的JSON属性名称不匹配。JavaScript代码生成的JSON看起来像

{"items":[{"id":"1","collapsed":"False","order":"1","column":"1"}]}
但是这些属性名称不是c#类中的属性名称,并且您没有覆盖这些名称。请尝试以下方法:

[DataContract]
public class SaveWidgetsDAL
{
    [DataMember(Name="items")]
    public List<Widgets> wdata { get; set; }

    public SaveWidgetsDAL() { }

    [DataContract]
    public class Widgets
    {
        // I was able to figure out which JSON properties to which to map these properties.
        [DataMember(Name = "column")]
        public string ColumnId { get; set; }

        [DataMember(Name = "collapsed")]
        public string Collapsed { get; set; }


        // However it is unclear how to map these to your JSON.  
        [DataMember(Name = "sortno")]
        public string SortNo { get; set; }

        [DataMember(Name = "title")]
        public string Title { get; set; }

        [DataMember(Name = "userid")]
        public string UserId { get; set; }

        [DataMember(Name = "widgetid")]
        public string WidgetId { get; set; }
    }
}
您需要确保外部类和嵌套类都具有此属性

更新

这是创建JSON的代码部分:

            var collapsed = 0;
            if ($(this).find('.dragbox-content').css('display') == "none")
                collapsed = 1;
            //Create Item object for current panel  
            var item = {
                id: $(this).attr('id'),
                collapsed: collapsed,
                order: i,
                column: columnId
            };
            //Push item object into items array  
            items.push(item);

        var json = JSON.stringify(sortorder);
因此,
数组中的每个
仅包含以下四个命名属性:

[DataContract]
public class SaveWidgetsDAL
{
    [DataMember(Name = "items")]
    public List<Widgets> wdata { get; set; }

    public SaveWidgetsDAL() { }

    [DataContract]
    public class Widgets
    {
        // I was able to figure out which JSON properties to which to map these properties.
        [DataMember(Name = "id")]
        public string Id { get; set; }

        [DataMember(Name = "collapsed")]
        public string Collapsed { get; set; }

        [DataMember(Name = "order")]
        public string Order { get; set; }

        [DataMember(Name = "column")]
        public string ColumnId { get; set; }
    }
}
  • id
  • 已折叠
  • 订单
var项中使用的属性名={id:value1,collapsed:value2,…}
语句是
JSON.stringify()
写入
JSON
字符串的名称。c代码中指定的数据成员名称必须与这些名称完全匹配,以便使用
DataContractJsonSerializer
反序列化它们。因此,以下c#类将反序列化这四个命名属性:

[DataContract]
public class SaveWidgetsDAL
{
    [DataMember(Name = "items")]
    public List<Widgets> wdata { get; set; }

    public SaveWidgetsDAL() { }

    [DataContract]
    public class Widgets
    {
        // I was able to figure out which JSON properties to which to map these properties.
        [DataMember(Name = "id")]
        public string Id { get; set; }

        [DataMember(Name = "collapsed")]
        public string Collapsed { get; set; }

        [DataMember(Name = "order")]
        public string Order { get; set; }

        [DataMember(Name = "column")]
        public string ColumnId { get; set; }
    }
}

这将允许您查看JSON并确保数据成员名称与JSON属性名称匹配

您是否验证了JQuery正在传递数据?我相信是的。当我使用测试数据时,它是可以通过的。验证它是否正在传递数据的最佳方法是什么?使用fiddler。在发送AJAX请求时检查它。里面应该有你的JSON数据。啊,我想我不能。函数UpdateWidget()在小部件放置时执行,并假定获取小部件的ID。try console.log(response.innerHtml)或类似的内容。这将在浏览器的DevTools-Console选项卡中显示AJAX数据。这肯定有帮助。现在在我的foreach循环中,我可以看到data.wdata中的计数,它显示了11个(我有11个小部件,所以这很有希望),但是当我展开折叠时,sortno、columnId和title都为null,因为它们都是空的。我将用我目前的问题更新我的问题。@humphy-你遗漏了一个
[DataContract]
属性。啊,我是个笨蛋。又是一个好球。现在我只需要清理列名(FeaturedContent_Column1)和小部件id。。。谢谢你的帮助!我还有一个问题要问你。既然您知道如何成功地做到这一点,那么您知道如何调用保存回来的数据来保存每个用户的小部件吗?我能够用正确的用户ID保存每个小部件,现在我回到这个仪表板并尝试让它保持。我也要求了,我给了他一笔赏金。
{"items":[{"id":"1","collapsed":"False","order":"1","column":"1"}]}
[DataContract]
public class SaveWidgetsDAL
{
    [DataMember(Name="items")]
    public List<Widgets> wdata { get; set; }

    public SaveWidgetsDAL() { }

    [DataContract]
    public class Widgets
    {
        // I was able to figure out which JSON properties to which to map these properties.
        [DataMember(Name = "column")]
        public string ColumnId { get; set; }

        [DataMember(Name = "collapsed")]
        public string Collapsed { get; set; }


        // However it is unclear how to map these to your JSON.  
        [DataMember(Name = "sortno")]
        public string SortNo { get; set; }

        [DataMember(Name = "title")]
        public string Title { get; set; }

        [DataMember(Name = "userid")]
        public string UserId { get; set; }

        [DataMember(Name = "widgetid")]
        public string WidgetId { get; set; }
    }
}
    // [DataContract] missing
    public class Widgets
    {
            var collapsed = 0;
            if ($(this).find('.dragbox-content').css('display') == "none")
                collapsed = 1;
            //Create Item object for current panel  
            var item = {
                id: $(this).attr('id'),
                collapsed: collapsed,
                order: i,
                column: columnId
            };
            //Push item object into items array  
            items.push(item);

        var json = JSON.stringify(sortorder);
[DataContract]
public class SaveWidgetsDAL
{
    [DataMember(Name = "items")]
    public List<Widgets> wdata { get; set; }

    public SaveWidgetsDAL() { }

    [DataContract]
    public class Widgets
    {
        // I was able to figure out which JSON properties to which to map these properties.
        [DataMember(Name = "id")]
        public string Id { get; set; }

        [DataMember(Name = "collapsed")]
        public string Collapsed { get; set; }

        [DataMember(Name = "order")]
        public string Order { get; set; }

        [DataMember(Name = "column")]
        public string ColumnId { get; set; }
    }
}
    System.Diagnostics.Debug.WriteLine(json);