2016-08-16 7 views
-3

クエリ文字列としてC#オブジェクトを渡したい&私は次のコードを使用して目的の結果を得ました。上記のコードを使用してクエリ文字列として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オブジェクトを持っており、正しいクエリ文字列に変換することができます。 jQueryのを使用して

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

私は$.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

1)長いクエリ文字列はなぜですか?なぜIDじゃないの? 2)、もしあれば、代わりにJSONにシリアル化するのはなぜですか? –

+0

OK、それを行うコードを書いてください。何が問題になっていますか? –

+0

@RoyiNamir:この情報をクエリ文字列としてWebページに送信する必要があります。私はページを呼び出すことを試みていて、そのページはクエリ文字列として渡される値を期待しています。 – SharpCoder

答えて

1

問題はあなたのオブジェクトにToString()と呼んでいるということです。 List<String>.ToString()は、"List<System.String>"を返します。これは、URLエンコードされたものを除き、あなたが見ているものです。

あなたはどちらかにする必要があります:

  1. ToQueryString方法でiterfaceを提供します

    public interface IQueryStringable 
    { 
        string ToQueryString(); 
    } 
    

    、あなたはそれを実装するクエリ文字列として使用することをお勧めしますすべてのクラスを持っている、または

  2. シーケンスを反復するようにリフレクションを書き換えます。何かのようなもの(擬似コード):

    1. プロパティを取得します。
    2. IEnumerableのインスタンスであるかどうかを確認してください。それ以外の場合は、
    3. 、それ以外の場合は
    4. の各項目に対して、プロパティ名"[]="とその項目の値からなる文字列を作成します。
    5. 生成された文字列を連結し、それをurlencodeします。

は正気のために、私はオプション1をお勧めします、と私は反射で遊んでお楽しみください。クラスの任意の入れ子を許可したい場合、より複雑になります。

関連する問題