c# - 复制的 NameValueCollection 的 ToString() 未输出所需的结果

标签 c# asp.net

我在用户控件中有一个 NameValueCollection,它是这样初始化的:

private NameValueCollection _nameValues = HttpUtility.ParseQueryString(Request.QueryString.ToString());

当我调用 ToString() 时,它会生成一个正确的查询字符串,我可以将其用于更新的 url。

但是,当我像这样通过其构造函数复制 NameValueCollection 时:

var nameValues = new NameValueCollection(_nameValues);

然后尝试形成一个 url:

var newUrl = String.Concat(_rootPath + "?" + nameValues.ToString());

它输出这样的 url:

"http://www.domain.com?System.Collections.Specialized.NameValueCollection "

如何复制 NameValueCollection 以便 ToString() 方法输出所需的结果?

最佳答案

问题是您的代码中有两种实际类型。第一个是 System.Web.HttpValueCollection,它覆盖了 ToString 方法以获得您期望的结果,第二个是 System.Collection.Specialized.NameValueCollection,它没有覆盖 ToString。如果您确实需要使用 System.Collection.Specialized.NameValueCollection,您可以做的是创建一个扩展方法。

 public static string ToQueryString(this NameValueCollection collection)
 {
        var array = (from key in collection.AllKeys
                     from value in collection.GetValues(key)
                     select string.Format("{0}={1}", HttpUtility.UrlEncode(key), HttpUtility.UrlEncode(value))).ToArray();
        return "?" + string.Join("&", array);
    }

并使用它:

var newUrl = String.Concat(_rootPath,nameValues.ToQueryString());

关于c# - 复制的 NameValueCollection 的 ToString() 未输出所需的结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19723931/

相关文章:

c# - 如何从 linq 查询结果中忽略/删除非数字值 C#

c# - 检测监视器是否在 c# 上

asp.net - Microsoft EDGE - 访问此资源所需的安全证书无效

javascript - 使用 javascript 拖放

c# - 多次 Response.writeAsync 调用

c# - 如何在有条件的一列中使用 LINQ select

html - 菜单中的子菜单显示在带有母版页的网页形式的内容下,如何解决这个问题

c# - 我们如何将视频实时编码为 mp4 并在 ASP.NET 中进行流式传输

c# - 从 Windows 服务访问数据库

c# - .net Windows 服务本地应用程序数据与普通应用程序中的数据不同