【问题标题】:Convert string to Array passed as Argument to AjaxManager将字符串转换为作为参数传递给 AjaxManager 的数组
【发布时间】:2020-05-30 09:26:13
【问题描述】:

我正在尝试使用 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();
    }

非常感谢任何帮助

【问题讨论】:

  • 您的Json 无效。
  • Sajid,不幸的是,我明白这一点,但这就是我使用 Json.stringify 时创建的。如果不是整个问题,那也是问题的很大一部分。
  • 如果您将items.push([value]); 更改为items.push(value); 并将zones.push([i, items]); 更改为zones.push([index : i, items: items]);,可能会为您提供类似[{index : 1,items : ["Ticket Core.AFE","Ticket Core.CompanyName"]},{2,["Ticket Core.CompanyCity","Ticket Core.CompanyState"]}] 的json 并且易于反序列化。

标签: c# arrays json telerik-ajax


【解决方案1】:

可能不是答案,但 JSON.stringify 接受第二个参数,您可以在其中指定键值对中的键:JSON.stringify(data, ['key1', 'key2', 'key3'])。或者,第二个参数可以是一个函数,但我认为这对于直接字符替换更有用。

【讨论】:

    猜你喜欢
    • 2012-07-26
    • 1970-01-01
    • 2023-04-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-10-03
    相关资源
    最近更新 更多