在 C# 中输出一个经过操作的 QueryString

本文关键字:经过 一个 操作 QueryString 输出 | 更新日期: 2023-09-27 17:47:22

使用以下代码,我得到了一个很好的格式化字符串:

Request.QueryString.ToString 

给我这样的东西:&hello=world&microsoft=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());

有没有一种更整洁的方法来输出它,而不是手动查找和构建字符串?

在 C# 中输出一个经过操作的 QueryString

HttpValueCollection 是内部的,但您可以使用 "var" 来声明它,而无需使用 reflector 提取它。

var query = HttpUtility.ParseQueryString(Request.Url.Query);
query["Lang"] = myLanguage; // Add or replace param
string myNewUrl = Request.Url.AbsolutePath + "?" + query;
您还可以

使用 Reflector 将HttpValueCollection类提取到您自己的类中,然后使用它。

因为它实际上是一个特殊的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<DictionaryEntry>()
    .Where(entry => entry.Key != "sid")
    .ToDictionary(entry => entry.Key, entry => entry.Value);

Request.QueryString 实际上返回了一个 HttpValueCollection 对象(不幸的是,它是 System.Web 的内部对象,所以你不能它)。

尽管如此,HttpValueCollection 是从 NameValueCollection 派生的,它的 Remove() 方法保持不变,所以你应该能够调用 Request.QueryString.Remove("sid");

相关文章: