2011-08-15 30 views
10

Có vẻ như ToString() trong HttpContext.Request.Form được trang trí sao cho kết quả khác nhau từ một trở về từ ToString() whencalled trực tiếp trên một NameValueCollection:Tại sao giá trị trả về của Request.Form.ToString() khác với kết quả của 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; 

kết quả là như sau:

RequestForm: nói = hallo & từ = tôi

NameValue: System.Collections.Speci alized.NameValueCollection

Làm cách nào tôi có thể nhận được "string NameValueString = mycollection.ToString();" để trả lại "say = hallo & từ = tôi"?

Trả lời

9

Lý do bạn không thấy đầu ra được định dạng độc đáo là bởi vì Request.Form thực sự thuộc loại System.Web.HttpValueCollection. Lớp này ghi đè ToString() để nó trả về văn bản bạn muốn. Tiêu chuẩn NameValueCollection không không ghi đè ToString() và do đó bạn có được kết quả của phiên bản object.

Nếu không có quyền truy cập vào các phiên bản đặc biệt của lớp, bạn sẽ cần phải lặp bộ sưu tập bản thân và xây dựng chuỗi:

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

Bạn cần lặp lại trên mycollection và tự xây dựng chuỗi, định dạng theo cách bạn muốn. Dưới đây là một cách để làm điều đó:

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(); 

Lý do mà chỉ đơn giản gọi ToString() trên của bạn NameValueCollection không hoạt động là Object.ToString() method là những gì đang thực sự được gọi là, mà (trừ khi ghi đè) trả về tên loại đầy đủ của đối tượng. Trong trường hợp này, tên loại hoàn toàn đủ điều kiện là "System.Collections.Specialized.NameValueCollection".

1

Một phương pháp hoạt động tốt:

var poststring = new System.IO.StreamReader(Request.InputStream).ReadToEnd(); 
Các vấn đề liên quan