我正在尝试使用 Telerik AjaxManager 将 .aspx 页面上的 jQuery 数组发布到代码隐藏中的方法。我遇到的问题是使用 C# 将字符串转换为列表甚至数组。字符串(在 jQuery 中使用 Json.stringify 之后)如下所示:
string zoneString = "[[1,[["Ticket Core.AFE"],["Ticket Core.CompanyName"]]],[2,[["Ticket Core.CompanyCity"],["Ticket Core.CompanyState"]]]]"
我试图像这样反序列化:
List<ZoneInfo> zones = JsonConvert.DeserializeObject<List<ZoneInfo>>(zonesString);
但这会产生以下错误:
Message=无法将当前 JSON 数组(例如 [1,2,3])反序列化为类型“COGS.Web.Modules.Admin.ReportWizard+ZoneInfo”,因为该类型需要 JSON 对象(例如 {"name":"value" }) 正确反序列化。要修复此错误,请将 JSON 更改为 JSON 对象(例如 {"name":"value"})或将反序列化类型更改为数组或实现集合接口的类型(例如 ICollection、IList),例如可以从 JSON 数组反序列化。JsonArrayAttribute 也可以添加到类型中以强制它从 JSON 数组反序列化。路径“[0]”,第 1 行,位置 2。
这是客户端代码:
var zones = [];
for (var i = 1; i <= zoneCount; i++)
{
var o = $.data(listBox, i.toString());
if(o != undefined)
{
var items = [];
var a = o._array;
//pull the key/value
for (x = 0; x < a.length; x++)
{
var item = a[x];
var value = item.get_value();
items.push([value]);
}
zones.push([i, items]);
}
}
jsonZones = JSON.stringify(zones);
var ajaxManager = $find("<%= ((RadAjaxManager)this.Page.Master.FindControl("RadAjaxManager1")).ClientID %>");
ajaxManager.ajaxRequest('CREATEREPORT|' + jsonZones + '|' + tid);
这是服务器端代码:
protected void AjaxMgr_AjaxRequest(object sender, AjaxRequestEventArgs e)
{
LoggerBA.Log(DB_Context, Path.GetFileName(Request.ServerVariables["SCRIPT_NAME"]), MethodBase.GetCurrentMethod().Name, UtilityBA.LoggerLevel.Info, "IsPostBack: " + IsPostBack.ToString());
string[] args = e.Argument.Split('|');
string sCommand = args[0];
switch (sCommand.ToUpper())
{
case "CREATEREPORT":
string zonesString = args[1];
List<ZoneInfo> zones = JsonConvert.DeserializeObject<List<ZoneInfo>>(zonesString);
var template = args[2];
string[] zone = new string[zones.Count];
break;
}
InitializeWizard();
}
非常感谢任何帮助