3

フォームのクエリ文字列を受け入れようとしています

?param[key1]=value1&param[key2]=value2

または代わりに

?where[column1]=value1&where[column2]=value1
&orderby[column1]=asc&orderby[column2]=desc

としてアクセスできるように、C#MVC 4WebAPIで辞書に変換しますparam["key1"]。これはPHPで行うのは簡単ですが、C#でこれを再現する方法を見つけることができませんでした。

私は私が経由して配列を取ることができることを知っています

?param=value1&param=value2

私が何かをすることができるように

?where=column1&where=column2
&whereval=value1&whereval=value2
&orderby=column1&orderby=column2
&orderbycard=asc&orderbycard=desc

しかし、それは注文の問題を残し、私の目的にはほとんど役に立ちません。

これがフレームワークの制限ではないことを期待して、できれば関数のパラメーターで辞書を取得できるように、C#で辞書スタイルの変換を実装するにはどうすればよいですか?

明確にするために:私はクエリ文字列をNVCに変換するのではなく、クエリ文字列パラメータを独自のNVCに変換することを目指しています。これは、ParseQueryString()やRequest.QueryStringオブジェクトほど単純ではありません。

この質問は、この質問と重複しているという理由で前回クローズされたので、説明を追加しました。これを複製としてマークすることを検討している人は、私の例を真剣に検討するだけでなく、そうする前に私がここで求めていることを検討するようにお願いします。

4

3 に答える 3

4

その結果を達成するための組み込みの方法はありません。以下は、名前付きグループで正規表現を使用して、私の試みです。分割をスキップして、正規表現自体の中で文字?と文字を処理することは可能ですが、パターンをきれいに保つためにこのアプローチを採用しました。&

string input = "?where[column]=value&where[column2]=value2&orderby[column]=asc&orderby[column2]=desc";
string pattern = @"(?<Type>[^[]+)\[(?<Key>[^]]+)\]=(?<Value>.+)";
var re = new Regex(pattern);
var dict = input.Split(new[] { "?", "&" }, StringSplitOptions.RemoveEmptyEntries)
                .Select(s => re.Match(s))
                .GroupBy(m => m.Groups["Type"].Value)
                .ToDictionary(g => g.Key,
                    g => g.ToDictionary(x => x.Groups["Key"].Value,
                                        x => x.Groups["Value"].Value));

foreach (var t in dict.Keys)
{
    Console.WriteLine("Type: " + t);
    foreach (var k in dict[t].Keys)
    {
        Console.WriteLine("{0}: {1}", k, dict[t][k]);
    }
}

もちろん、これは、事前にチェックするキーを知っていることに依存しています。dict["where"]["column"]

キーの存在を確認するには、 メソッドContainsKeyとメソッドが役立つ場合があります。TryGetValue

string result;
if (dict["where"].TryGetValue("column", out result))
{
    Console.WriteLine(result);
}
于 2013-02-02T02:59:57.070 に答える
0

あなたはこのようなことを試すことができます

var queryString = "http://example.com/api/objects?where[id]=4&orderby[id]=asc?";
string[] arr = queryString.Split(new char[] { '&' });
int cntVar = 0; // start key
Dictionary<int, string> dictQuery;
dictQuery = arr.ToDictionary(d => ++cntVar);
于 2013-02-01T18:38:42.010 に答える