【问题标题】:getJSON array parameter data in ashxashx 中的 getJSON 数组参数数据
【发布时间】:2011-10-13 21:55:50
【问题描述】:

我在将数组参数传递给我的 .ashx 处理程序时遇到问题。查询字符串参数工作正常,但我不知道如何从 ashx 文件中访问数组。

我的数组是一个名为 list 的字符串列表。这就是我调用 getJSON 方法的方式:

jQuery.getJSON('Handlers/AccessoryUpdateHandler.ashx?action=updateselection&a=' + a_sku, function (list) {
            //...
        });

在 AccessoryUpdateHandler.ashx 中,我可以使用 context.Request.QueryString["a"]; 获取查询字符串参数

但是如何获取数组数据呢?我查看了 Request.QueryString 对象,但那里没有任何东西看起来像我的数组。

如果有更好的方法,我也很想知道。

【问题讨论】:

    标签: c# jquery asp.net json getjson


    【解决方案1】:

    也许您不应该依赖 QueryString 来传递这种数据。我建议您改用“POST”方法。在任何一种情况下,使用您正在使用的方法,您都无法将数据作为数组传递。将数组转换为字符串。如果您不想手动将数组转换为字符串,像 stringify() 这样的实用程序可以派上用场。当您从处理程序中的 Request.QueryStringRequest.Form(如果您使用 post)中提取字符串时,您可以轻松使用 JavaScriptSerializer 使用一个简单的 C# 类进行反序列化,该类的架构类似于您的 json 数组。

    已编辑:插图

    这样的数组:

    var ary = [{ "id": "1", "name": "Mark" }, { "id": "2", "name": "John"}];
    

    可以转换成这样的字符串:

    var aryS = "[{\"id\":\"1\",\"name\":\"Mark\"},{\"id\":\"1\",\"name\":\"Mark\"}]";
    

    那么,您的 QueryString 可以构造为:

    jQuery.getJSON('Handlers/AccessoryUpdateHandler.ashx?action=updateselection&a=' + aryS, function (list) {
            //...
        });
    

    当您转到处理程序代码时,您可以有一个简单的类来帮助您反序列化数据:

    class Rec 
    {
        public int Id { get; set; }
        public string Name { get; set; }
    }
    

    有了这些,反序列化的最后一步是:

    string s = context.Request.QueryString["a"]; // HttpContext context
    var jserializer = new JavaScriptSerializer();
    var ary = jserializer.Deserialize<Rec[]>(s);
    

    请注意,您必须在 Deserialize 函数中使用 Rec[],因为您要反序列化为数组。 ary 将是一个 Rec 数组,其中包含您的 javascript 数组中的所有数据。使用 JavaScriptSerializer 需要引用 System.Web.Extensions

    编辑:

    我以为你在谈论一组对象。如果它只是一个 *long*s 的数组,那么以下几行就足够了:

    string s = context.Request.QueryString["a"]; // HttpContext context
    var jserializer = new JavaScriptSerializer();
    var ary = jserializer.Deserialize<long[]>(s);
    

    而且你不需要创建一个类。如果你有一个 json 对象数组,你只需要它

    【讨论】:

    • 当我按照您的建议进行操作时,我收到错误消息:“无效的 JSON 原语:10030113283313,10030113295513。”当我调用'serializer.Deserialize(s)'。如果我在我的 js 文件中的数组上使用 JSON.stringify(),我会在同一点收到错误“无法将“System.String”类型的对象转换为“AccessoryUpdateHandler+Rec”类型。但这绝对是对我之前的改进!
    • 请记住,类成员的类型必须与数组对象的类型相匹配。另一件事:如果您的 json 对象的某些成员可以为空,[例如在 { "id": , "name": "unknown" }, id 将是 undefined/null ] 在这种情况下您可能需要使用可为空的成员。例如:int?身份证{得到;放; } 如果 id 在你的 json 对象中可以为空
    • "如果我在我的 js 文件中的数组上使用 JSON.stringify(),我在同一点。”由于我无法想象您的确切情况,我建议您逐步接近它。如果您的 json 对象有 10 个成员,您可以删除除一两个之外的所有成员,测试序列化是否在服务器端正确发生,然后逐步添加其他成员。这样你就可以知道什么是失败的。
    • 我的数组看起来不像你描述的那个,这可能是问题吗?这是从 stringify() 返回的字符串:'"["10030113312013","10030113283313","10030113295513"]"'
    • @markpsmith 我似乎已经理解了复杂的场景。我编辑了答案以适应您的情况。
    【解决方案2】:

    我不认为您需要传递数组应该决定您是否像其他人建议的那样使用 get 或 post。

    使用get,最惯用的方式是多次使用同一个参数。例如

    Handlers/AccessoryUpdateHandler.ashx?a=1&a=2&a=55
    

    事实上,在大多数框架(.NET 除外)中,当您从 url 获取参数时,您会得到一个数组返回(通常带有一项)

    我的建议是你解析 context.Request.RawUrl

    【讨论】:

      猜你喜欢
      • 2011-03-27
      • 2017-09-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-05-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多