【问题标题】:Passing c# object as query string将 c# 对象作为查询字符串传递
【发布时间】:2016-08-16 18:33:58
【问题描述】:

我想将 C# 对象作为查询字符串传递,并且我使用以下代码来获得所需的结果。

 class Program
    {
        public static string GetQueryString(object obj)
        {
            var properties = from p in obj.GetType().GetProperties()
                             where p.GetValue(obj, null) != null
                             select p.Name + "=" + HttpUtility.UrlEncode(p.GetValue(obj, null).ToString());

            return String.Join("&", properties.ToArray());
        }
        static void Main(string[] args)
        {
            Filters fil = new Filters();
            fil.Age = 10;
            fil.Id = "some id";

            fil.Divisions = new List<string>();
            fil.Divisions.Add("div 1");
            fil.Divisions.Add("div 2");
            fil.Divisions.Add("div 3");

            fil.Names = new List<string>();
            fil.Names.Add("name 1");
            fil.Names.Add("name 2");
            fil.Names.Add("name 3");

            var queryStr = GetQueryString(fil);
            Console.ReadKey();
        }



    }

    public class Filters
    {
        public List<string> Names { get; set; }
        public List<string> Divisions { get; set; }
        public int Age { get; set; }
        public string Id { get; set; }
    }

使用上面的代码给我以下结果:

Names=System.Collections.Generic.List%601%5bSystem.String%5d&Divisions=System.Collections.Generic.List%601%5bSystem.String%5d&Age=10&Id=some+id

输出不是有效的查询字符串。我需要帮助将任何 POCO 类转换为查询字符串格式。

我有一个类似的 JavaScript 对象,我能够将它转换为正确的查询字符串。

{
  "id":"some id",
  "age":10,
  "division":["div 1","div 2","div 3"],
  "names":["name 1","name 2","name 3"]
}

使用 Jquery 我可以说 $.param(obj) 这将导致:

"id=some+id&age=10&division%5B%5D=div+1&division%5B%5D=div+2&division%5B%5D=div+3&names%5B%5D=name+1&names%5B%5D=name+2&names%5B%5D=name+3"

我想要使用 c# 的类似输出。

【问题讨论】:

  • 1) 为什么查询字符串这么长?为什么不是身份证? 2)如果你有 - 为什么不将它序列化为 JSON 呢?
  • 好的,写代码来做。你有什么问题?
  • @RoyiNamir:我需要将此信息作为查询字符串传递给网页。我正在尝试调用一个页面,该页面期望值作为查询字符串传递
  • @EdPlunkett:我添加了一些代码,但没有产生预期的结果
  • 进一步了解 Royi - 查询字符串的长度也有限制。您可能需要考虑将其作为有效负载的一部分在 POST 中传递,而不是在 GET 查询字符串中传递。无论如何,您的结果 确实 看起来像一个有效的查询字符串。我认为你的意思是你想要对象的值,但你输出的是类型

标签: c# .net linq c#-4.0 query-string


【解决方案1】:

看起来问题是你在你的对象上调用ToString()List&lt;String&gt;.ToString() 将返回 "List&lt;System.String&gt;",这就是您所看到的,除了 URL 编码。

您将需要:

  1. 提供一个带有ToQueryString 方法的接口:

    public interface IQueryStringable
    {
        string ToQueryString();
    }
    

    并让您可能希望用作查询字符串的所有类都实现它,或者

  2. 重写您的反射,以便它迭代序列。类似(伪代码):

    1. 获取属性。
    2. 查看它是否是IEnumerable 的实例。如果没有,请照常进行
    3. 否则:
    4. 对于每个项目,构造一个由属性名称、"[]=" 和该项目的值组成的字符串。
    5. 连接生成的字符串并对其进行urlencode。

为了理智,我推荐选项 1,我喜欢玩反射。如果您想允许任意嵌套类,它会变得更加复杂。

【讨论】:

    猜你喜欢
    • 2011-07-27
    • 1970-01-01
    • 1970-01-01
    • 2015-04-17
    • 1970-01-01
    • 1970-01-01
    • 2016-08-27
    • 2022-06-16
    • 2020-04-16
    相关资源
    最近更新 更多