C# 使用json传递小部件数据并保存到数据库
我刚刚又回到这个需求上来,因为当时我被拉离它去做更重要的需求 我问了一个类似的问题,答案很有帮助。然而,在这个问题上,我传递了测试数据并将其保存到数据库中。但是,我不知道如何保存实际的小部件信息。这个链接帮助我成功地传递了json 我在尝试保存数据时收到此消息 jQuery 处理者 Widgets数据类 但是,我现在在插入数据库时遇到这个错误。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#数据契约中指定的属性名
我可以看到我的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);