为什么Request.Form.ToString()的返回值与NameValueCollection.ToString(

本文关键字:ToString 返回值 NameValueCollection Request 为什么 Form | 更新日期: 2023-09-27 18:05:51

似乎HttpContext.Request.Form中的ToString()被装饰了,所以结果是不同的从ToString()直接在NameValueCollection上调用时返回的值:

NameValueCollection nameValue = Request.Form;
string requestFormString = nameValue.ToString();
NameValueCollection mycollection = new NameValueCollection{{"say","hallo"},{"from", "me"}};
string nameValueString = mycollection.ToString();
return "RequestForm: " + requestFormString + "<br /><br />NameValue: " + nameValueString;

结果如下:

RequestForm:说= hallo&从我=

NameValue: System.Collections.Specialized.NameValueCollection

我怎么能得到"string NameValueString = mycollection.ToString();"返回"say=hallo&from=me"?

为什么Request.Form.ToString()的返回值与NameValueCollection.ToString(

看不到格式化好的输出的原因是Request.Form实际上是System.Web.HttpValueCollection类型。这个类覆盖ToString(),以便它返回您想要的文本。标准NameValueCollection覆盖ToString(),因此您得到object版本的输出。

如果不能访问类的专门化版本,则需要自己迭代集合并构建字符串:

StringBuilder sb = new StringBuilder();
for (int i = 0; i < mycollection.Count; i++)
{
   string curItemStr = string.Format("{0}={1}", mycollection.Keys[i],
                                                 mycollection[mycollection.Keys[i]]);
   if (i != 0)
       sb.Append("&");
   sb.Append(curItemStr);
}
string prettyOutput = sb.ToString();

您需要遍历mycollection并自己构建一个字符串,以您想要的方式格式化它。这里有一种方法:

StringBuilder sb = new StringBuilder();
foreach (string key in mycollection.Keys)
{
   sb.Append(string.Format("{0}{1}={2}",
      sb.Length == 0 ? string.Empty : "&",
      key,
      mycollection[key]));
}
string nameValueString = sb.ToString();

NameValueCollection上简单地调用ToString()不起作用的原因是Object.ToString()方法是实际被调用的,它(除非被覆盖)返回对象的完全限定类型名称。在本例中,完全限定类型名称为"System.Collections.Specialized.NameValueCollection"。

另一个有效的方法:

var poststring = new System.IO.StreamReader(Request.InputStream).ReadToEnd();