为什么NameValueCollection的行为不同?

时间:2017-12-20 12:10:29

标签: c# asp.net namevaluecollection

NameValueCollection x = new NameValueCollection(Request.QueryString);
string x1 = x.ToString();
NameValueCollection y = HttpUtility.ParseQueryString(Request.QueryString.ToString());
string y1 = y.ToString();

当我执行上面的代码时,x1和y1的值变为

x1="System.Collections.Specialized.NameValueCollection"
y1="abc=1&xyz=2"   //url pass to controller is 'localhost/first/getresult/?abc=1&xyz=2'

我不明白为什么x1 and y1 is different的价值。我查看了ParseQueryString()的文档,并显示它return NameValueCollection,但我没有获得任何其他信息。

所以,我不明白为什么xy的行为不同。

1 个答案:

答案 0 :(得分:3)

如果HttpUtility.ParseQueryString,则返回HttpValueCollection类的实例(source),该实例继承自NameValueCollection。显然,这个类有意义地覆盖ToString,而不是NameValueCollection从对象继承ToString,因此只是覆盖全类型名称。

ParseQueryString中没有提到这一点,因为HttpValueCollectioninternal。他们不希望您使用此类型,并且您不应该依赖此类型返回。

以下是ToStringHttpValueCollection的{​​{3}}:

public override String ToString() {
    return ToString(true);
}

internal virtual String ToString(bool urlencoded) {
    return ToString(urlencoded, null);
}

internal virtual String ToString(bool urlencoded, IDictionary excludeKeys) {
    int n = Count;
    if (n == 0)
        return String.Empty;

    StringBuilder s = new StringBuilder();
    String key, keyPrefix, item;
    bool ignoreViewStateKeys = (excludeKeys != null && excludeKeys[Page.ViewStateFieldPrefixID] != null);

    for (int i = 0; i < n; i++) {
        key = GetKey(i);

        // Review: improve this... Special case hack for __VIEWSTATE#
        if (ignoreViewStateKeys && key != null && key.StartsWith(Page.ViewStateFieldPrefixID, StringComparison.Ordinal)) continue;
        if (excludeKeys != null && key != null && excludeKeys[key] != null)
            continue;
        if (urlencoded)
            key = UrlEncodeForToString(key);
        keyPrefix = (key != null) ? (key + "=") : String.Empty;

        string[] values = GetValues(i);

        if (s.Length > 0)
            s.Append('&');

        if (values == null || values.Length == 0) {
            s.Append(keyPrefix);
        }
        else if (values.Length == 1) {
            s.Append(keyPrefix);
            item = values[0];
            if (urlencoded)
                item = UrlEncodeForToString(item);
            s.Append(item);
        }
        else {
            for (int j = 0; j < values.Length; j++) {
                if (j > 0)
                    s.Append('&');
                s.Append(keyPrefix);
                item = values[j];
                if (urlencoded)
                    item = UrlEncodeForToString(item);
                s.Append(item);
            }
        }
    }

    return s.ToString();
}