在c#中输出一个受控的QueryString
使用以下代码我得到一个很好的格式化字符串:
Request.QueryString.ToString
给我一些类似的东西:&hello = world&microsoft =糟透了
但是,当我使用此代码将集合克隆到另一个对象(相同类型)时,我从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());
是否有更整洁的输出方式,而不是手动查看和构建字符串?
您还可以使用Reflector将HttpValueCollection
类提取到您自己的类中,然后使用它。
HttpValueCollection是内部的,但您可以使用“var”声明它而不用reflection器提取它。
var query = HttpUtility.ParseQueryString(Request.Url.Query); query["Lang"] = myLanguage; // Add or replace param string myNewUrl = Request.Url.AbsolutePath + "?" + query;
因为它实际上是一个特殊的NVC,类型为HTTPValueCollection。 所以当你在它上面调用.ToString时,它知道如何正确地格式化它。
为什么要将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");
如果您不是绝对需要NameValueCollection,则字典提供了许多相同的语义:
var variables = Request.QueryString.OfType() .Where(entry => entry.Key != "sid") .ToDictionary(entry => entry.Key, entry => entry.Value);
Request.QueryString实际上返回一个HttpValueCollection对象(不幸的是,它是System.Web的内部,所以你不能这样做)。
然而,HttpValueCollection是从NameValueCollection派生的,它的Remove()方法保持不变,所以你应该能够调用Request.QueryString.Remove(“sid”);