C# 复制的NameValueCollection的ToString()不';t输出期望的结果

C# 复制的NameValueCollection的ToString()不';t输出期望的结果,c#,asp.net,C#,Asp.net,我在usercontrol中有一个NameValueCollection,初始化如下: private NameValueCollection _nameValues = HttpUtility.ParseQueryString(Request.QueryString.ToString()); 当我在上面调用ToString()时,它会生成一个适当的查询字符串,我可以使用它来更新url 但是,当我通过构造函数复制NameValueCollection时,如下所示: var nameValues

我在usercontrol中有一个
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:

“”


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

提供字符串格式的不是
NameValueCollection
。该功能位于内部类
System.Web.HttpValueCollection
中,该类由
HttpUtility.ParseQueryString
返回

因此,您将无法通过使用内置功能实现此行为。最好是创建一个扩展方法,将值格式化为URL格式

这是
HttpValueCollection
类中的方法-您可以通过一些修改来使用它

// System.Web.HttpValueCollection
internal virtual string ToString(bool urlencoded, IDictionary excludeKeys)
{
    int count = this.Count;
    if (count == 0)
    {
        return string.Empty;
    }
    StringBuilder stringBuilder = new StringBuilder();
    bool flag = excludeKeys != null && excludeKeys["__VIEWSTATE"] != null;
    for (int i = 0; i < count; i++)
    {
        string text = this.GetKey(i);
        if ((!flag || text == null || !text.StartsWith("__VIEWSTATE", StringComparison.Ordinal)) && (excludeKeys == null || text == null || excludeKeys[text] == null))
        {
            if (urlencoded)
            {
                text = HttpValueCollection.UrlEncodeForToString(text);
            }
            string value = (text != null) ? (text + "=") : string.Empty;
            string[] values = this.GetValues(i);
            if (stringBuilder.Length > 0)
            {
                stringBuilder.Append('&');
            }
            if (values == null || values.Length == 0)
            {
                stringBuilder.Append(value);
            }
            else
            {
                if (values.Length == 1)
                {
                    stringBuilder.Append(value);
                    string text2 = values[0];
                    if (urlencoded)
                    {
                        text2 = HttpValueCollection.UrlEncodeForToString(text2);
                    }
                    stringBuilder.Append(text2);
                }
                else
                {
                    for (int j = 0; j < values.Length; j++)
                    {
                        if (j > 0)
                        {
                            stringBuilder.Append('&');
                        }
                        stringBuilder.Append(value);
                        string text2 = values[j];
                        if (urlencoded)
                        {
                            text2 = HttpValueCollection.UrlEncodeForToString(text2);
                        }
                        stringBuilder.Append(text2);
                    }
                }
            }
        }
    }
    return stringBuilder.ToString();
}

internal static string UrlEncodeForToString(string input)
{
    return HttpUtility.UrlEncodeUnicode(input);
}
//System.Web.HttpValueCollection
内部虚拟字符串到字符串(bool urlencoded,IDictionary excludeKeys)
{
int count=this.count;
如果(计数=0)
{
返回字符串。空;
}
StringBuilder StringBuilder=新的StringBuilder();
bool flag=excludeKeys!=null&&excludeKeys[“\uu VIEWSTATE”]!=null;
for(int i=0;i0)
{
stringBuilder.Append('&');
}
如果(值==null | |值。长度==0)
{
stringBuilder.Append(值);
}
其他的
{
如果(values.Length==1)
{
stringBuilder.Append(值);
字符串text2=值[0];
如果(URL编码)
{
text2=HttpValueCollection.UrlEncodeForToString(text2);
}
stringBuilder.Append(text2);
}
其他的
{
对于(int j=0;j0)
{
stringBuilder.Append('&');
}
stringBuilder.Append(值);
字符串text2=值[j];
如果(URL编码)
{
text2=HttpValueCollection.UrlEncodeForToString(text2);
}
stringBuilder.Append(text2);
}
}
}
}
}
返回stringBuilder.ToString();
}
内部静态字符串UrlEncodeForToString(字符串输入)
{
返回HttpUtility.urlencodeucode(输入);
}
对名称-值集合调用
.ToString()
,只会给出它所属的名称空间

我怀疑您想要它的密钥和值,假设它是集合中的第一个,为什么不这样做:

var newUrl = String.Concat(_rootPath + "?" + nameValues.GetKey(0) + nameValues.Get(0));
您可以将其作为扩展方法:

public static string ToString(this NameValueCollection nvc, int idx)
{
     if(nvc == null)
         throw new NullReferenceException();

     string key = nvc[idx];
     if(nvc.HasKeys() && !string.IsNullOrEmpty(key))
     {
         return string.Concat(key, nvc.Get(key)); //maybe want some formatting here
     }

     return string.Empty;
}
用法:

NameValueCollection nvc = new NameValueCollection();
string foo = nvc.ToString(0); //gets key + value at index 0

问题是代码中有两种实际类型。第一个是
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());
可能重复的