【发布时间】:2014-12-16 07:00:07
【问题描述】:
我刚刚再次回到这个要求,因为当时我被拉出来去做更重要的要求。
我问了一个类似的问题here,答案很有帮助。但是,在那个问题中,我传递了测试数据并将其保存到数据库中。但是,我无法弄清楚如何保存实际的小部件信息。该链接帮助我成功传递了 json。
我在尝试保存数据时收到此消息。
jQuery
function updateWidgetData() {
var items = [];
$('.column').each(function () {
var columnId = $(this).attr('id');
$('.dragbox', this).each(function (i) {
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);
});
});
//Assign items array to sortorder JSON variable
var sortorder = { items: items };
$.ajax({
url: "/Handlers/SaveWidgets.ashx",
type: "POST",
contentType: "application/json; charset=uft-8",
dataType: "json",
data: JSON.stringify(sortorder),
success: function (response) {
alert("Passed json");
},
error: function (error) {
alert("Failed passing json.");
}
});
处理程序
public void ProcessRequest(HttpContext context)
{
String json = String.Empty;
// you have sent JSON to the server
// read it into a string via the input stream
using (StreamReader rd = new StreamReader(context.Request.InputStream))
{
json = rd.ReadToEnd();
}
// create an instance of YourDataModel from the
// json sent to this handler
SaveWidgetsDAL data = null;
DataContractJsonSerializer serializer = new DataContractJsonSerializer(typeof(SaveWidgetsDAL));
using (MemoryStream ms = new MemoryStream())
{
byte[] utf8Bytes = Encoding.UTF8.GetBytes(json);
ms.Write(utf8Bytes, 0, utf8Bytes.Length);
ms.Position = 0;
data = serializer.ReadObject(ms) as SaveWidgetsDAL;
}
// update the DB and
// send back a JSON response
int rowsUpdated = 0;
foreach (var item in data.wdata)
{
using (SqlConnection conn = new SqlConnection(ConfigurationManager.ConnectionStrings["dboCao"].ConnectionString))
{
conn.Open();
using (SqlCommand cmd = new SqlCommand("UPDATE tWidgetControl SET SortNo = @SortNo, ColumnId = @ColumnId, Collapsed = @Collapsed "
+ "WHERE UserId = @UserId AND WidgetId = @WidgetId;", conn))
{
cmd.Parameters.AddWithValue("@SortNo", item.SortNo);
cmd.Parameters.AddWithValue("@ColumnId", item.ColumnId);
cmd.Parameters.AddWithValue("@Collapsed", item.Collapsed);
cmd.Parameters.AddWithValue("@UserId", "2");
cmd.Parameters.AddWithValue("@WidgetId", item.WidgetId);
rowsUpdated = cmd.ExecuteNonQuery();
}
conn.Close();
}
}
context.Response.ContentType = "application/json";
context.Response.Write("{ \"rows_updated\": " + rowsUpdated + " }");
}
public bool IsReusable
{
get
{
return false;
}
}
小部件数据类
public class SaveWidgetsDAL
{
public List<Widgets> wdata { get; set; }
public SaveWidgetsDAL() { }
public class Widgets
{
[DataMember]
public string SortNo { get; set; }
[DataMember]
public string ColumnId { get; set; }
[DataMember]
public string Collapsed { get; set; }
[DataMember]
public string Title { get; set; }
[DataMember]
public string UserId { get; set; }
[DataMember]
public string WidgetId { get; set; }
}
}
我想我需要将 json 保存到一个列表中,然后将每个小部件信息插入/更新到数据库中。但是,当我尝试这个时,我收到了上面的错误。我显然错过了一些东西,但我不确定它是什么。此错误发生在我的处理程序中,但 SaveWidgetsDAL 中的列表为空,导致 NullReference。我不确定我错过了什么或不确定从这里去哪里。非常感谢任何帮助!
编辑 1:
我已经改变了我的数据库以及我的 SaveWidgetsDAL。
SaveWidgetsDAL
[DataContract]
public class SaveWidgetsDAL
{
[DataMember(Name = "items")]
public List<Widgets> wdata { get; set; }
public SaveWidgetsDAL() { }
public class Widgets
{
[DataMember(Name = "order")]
public string SortNo { get; set; }
[DataMember(Name = "column")]
public string ColumnId { get; set; }
[DataMember(Name = "collapsed")]
public string Collapsed { get; set; }
[DataMember(Name = "id")]
public string Title { get; set; }
}
}
处理程序(只是 foreach)
foreach (var item in data.wdata)
{
using (SqlConnection conn = new SqlConnection(ConfigurationManager.ConnectionStrings["dboCao"].ConnectionString))
{
conn.Open();
using (SqlCommand cmd = new SqlCommand("UPDATE tWidgetTest SET Title = @Title, SortNo = @SortNo, ColumnId = @ColumnId, Collapsed = @Collapsed "
+ "WHERE UserId = @UserId AND Title = @Title;", conn))
{
cmd.Parameters.AddWithValue("@Title", item.Title);
cmd.Parameters.AddWithValue("@SortNo", item.SortNo);
cmd.Parameters.AddWithValue("@ColumnId", item.ColumnId);
cmd.Parameters.AddWithValue("@Collapsed", item.Collapsed);
cmd.Parameters.AddWithValue("@UserId", "2");
rowsUpdated = cmd.ExecuteNonQuery();
}
conn.Close();
}
}
但是,我现在在插入数据库时收到此错误。
我可以看到我的 foreach 计数为 11,但 Collapsed、SortNo、ColumnId、Title 对于每个项目都是空的。
【问题讨论】:
-
您是否验证了 JQuery 正在传递数据?
-
我相信是的。当我使用测试数据时,它能够通过。验证它是否正在传递数据的最佳方法是什么?
-
使用提琴手。发送时检查您的 AJAX 请求。它应该包含您的 JSON 数据。
-
啊,我想我做不到。函数 UpdateWidget() 在小部件的放置上执行,并假设获取小部件的的 ID。试试 console.log(response.innerHtml) 或类似的东西。这将在浏览器的 DevTools - Console 选项卡中显示您的 AJAX 数据。
标签: c# jquery asp.net sql-server json