2011-09-23 8 views
10

私は小さなAPIを書いており、リクエスト内の重複キーをチェックする必要があります。誰かが重複するキーを確認する最善の方法をお勧めしますか。私は文字列のコンマの値を確認することができますが、APIリクエストでコンマを使用できないという別の問題があります。クエリー・ストリング/ポスト/ゲット・リクエストの重複キーをチェックする最も良い方法は何ですか?

//Does not compile- just for illustration 
    private void convertQueryStringToDictionary(HttpContext context) 
    { 
     queryDict = new Dictionary<string, string>(); 
     foreach (string key in context.Request.QueryString.Keys) 
     { 
      if (key.Count() > 0) //Error here- How do I check for multiple values? 
      {  
       context.Response.Write(string.Format("Uh-oh")); 
      } 
      queryDict.Add(key, context.Request.QueryString[key]); 
     }  
    } 

答えて

19

のQueryStringが重複するキー値が(Addメソッドのドキュメントからの)カンマ区切りリストとして表示されます理由を説明するNameValueCollection、次のとおりです。指定されたキーがすでにターゲットNameValueCollectionの中に存在している場合

インスタンスでは、指定された値が、カンマ区切りの 値リストに追加され、 "value1、value2、value3"の形式で値のリストに追加されます。

ので、例えば、このクエリ文字列を与えられた:q1=v1&q2=v2,v2&q3=v3&q1=v4を、キーを反復処理し、表示される値をチェック:

Key: q1 Value:v1,v4 
Key: q2 Value:v2,v2 
Key: q3 Value:v3 

を使用すると、クエリ文字列値のコンマを可能にしたいので、することができますGetValuesメソッドを使用します。これは、クエリ文字列のキーの値を含む文字列配列を返します。

static void Main(string[] args) 
{ 
    HttpRequest request = new HttpRequest("", "http://www.stackoverflow.com", "q1=v1&q2=v2,v2&q3=v3&q1=v4"); 

    var queryString = request.QueryString; 

    foreach (string k in queryString.Keys) 
    { 
     Console.WriteLine(k); 
     int times = queryString.GetValues(k).Length; 
     if (times > 1) 
     { 
      Console.WriteLine("Key {0} appears {1} times.", k, times); 
     } 
    } 

    Console.ReadLine(); 
} 

コンソールに以下を出力します

q1 
Key q1 appears 2 times. 
q2 
q3 
+1

私はそれを知りませんでした。 +1し、私の不正確な答えを削除しました – fearofawhackplanet

+0

うわー!どうもありがとうございます。 MSDNのWebサイトを書き直すことを検討しますか? –

+2

驚くばかりの答え@ jeff-ogata、私はこの動作を変更する方法があるので、この 'user_ids [] = 1,2,3'ではなく、これを持っています:' user_ids [] = 1&user_ids [] = 2&user_ids [] = 3'? – dombesz

関連する問題