23

次のコードを使用すると、適切にフォーマットされた文字列が得られます。

Request.QueryString.ToString 

&hello=worldµsoft=sucks のようなものが表示されます。

しかし、このコードを使用してコレクションを (同じ型の) 別のオブジェクトに複製すると、代わりに ToString() メソッドから Type() が返されます。

System.Collections.Specialized.NameValueCollection variables = new System.Collections.Specialized.NameValueCollection(Request.QueryString);
if (!string.IsNullOrEmpty(variables["sid"]))
    variables.Remove("sid");
Response.Write(variables.ToString());

文字列を手動で調べて構築するよりも、出力するためのより適切な方法はありますか?

4

6 に答える 6

69

HttpValueCollection は内部ですが、リフレクターで抽出せずに「var」を使用して宣言できます。

var query = HttpUtility.ParseQueryString(Request.Url.Query);
query["Lang"] = myLanguage; // Add or replace param
string myNewUrl = Request.Url.AbsolutePath + "?" + query;
于 2009-09-15T07:43:56.787 に答える
8

Reflector を使用してHttpValueCollectionクラスを独自に抽出し、それを使用することもできます。

于 2008-10-23T14:35:10.613 に答える
4

これは、実際には HTTPValueCollection タイプの特別な NVC であるためです。そのため、.ToString を呼び出すと、正しくフォーマットする方法が認識されます。

于 2008-10-23T14:32:20.977 に答える
2

QueryString コレクションを新しい NameValueCollection にコピーするのはなぜですか?

    if (!string.IsNullOrEmpty(Request.QueryString["sid"]))
        Request.QueryString.Remove("sid");

はい、確かに、私は間違っています。読み取り専用です。したがって、本質は NameValuecollection で Remove メソッドを使用することです。

System.Collections.Specialized.NameValueCollection variables = new System.Collections.Specialized.NameValueCollection(Request.QueryString);
if (!string.IsNullOrEmpty(variables["sid"]))
    variables.Remove("sid");
于 2008-10-23T14:30:16.987 に答える
1

NameValueCollectionが絶対に必要でない場合、ディクショナリは同じセマンティクスを多数提供します。

var variables = Request.QueryString.OfType<DictionaryEntry>()
    .Where(entry => entry.Key != "sid")
    .ToDictionary(entry => entry.Key, entry => entry.Value);
于 2008-10-23T15:07:10.517 に答える
0

Request.QueryString は実際には HttpValueCollection オブジェクトを返します (残念ながら、これは System.Web の内部にあるため、それを行うことはできません)。

それにもかかわらず、HttpValueCollection は NameValueCollection から派生しており、Remove() メソッドはそのままなので、Request.QueryString.Remove("sid"); を呼び出すことができるはずです。

于 2008-10-23T14:30:42.870 に答える