似乎HttpContext.Request.Form中的ToString()被装饰,因此结果不同 从直接在NameValueCollection上调用的ToString()返回的那个:
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:say = hallo&amp; from = me
NameValue:System.Collections.Specialized.NameValueCollection
如何获取“string NameValueString = mycollection.ToString();”返回“say = hallo&amp; from = me”?
答案 0 :(得分:9)
您没有看到格式良好的输出的原因是因为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();
答案 1 :(得分:1)
你需要迭代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();
简单地在ToString()
上调用NameValueCollection
不起作用的原因是Object.ToString()
method实际上是被调用的,除非被覆盖,否则返回对象的完全限定类型名称。在这种情况下,完全限定的类型名称是“System.Collections.Specialized.NameValueCollection”。
答案 2 :(得分:1)
另一种运作良好的方法:
var poststring = new System.IO.StreamReader(Request.InputStream).ReadToEnd();