HttpRequest的QueryString, Form属性的类型都是NameValueCollection,它个集合类型有一个特点:允许在一个键下存储多个字符串值。
以下代码演示了这个特殊的现象:
- protected void Page_Load(object sender, EventArgs e)
- {
- string[] allkeys = Request.QueryString.AllKeys;
- if( allkeys.Length == 0 )
- Response.Redirect(
- Request.RawUrl + "?aa=1&bb=2&cc=3&aa=" + HttpUtility.UrlEncode("5,6,7"), true);
- StringBuilder sb = new StringBuilder();
- foreach( string key in allkeys )
- sb.AppendFormat("{0} = {1}<br />",
- HttpUtility.HtmlEncode(key), HttpUtility.HtmlEncode(Request.QueryString[key]));
- this.labResult.Text = sb.ToString();
- }
页面最终显示结果如下(注意键值为aa的结果):
498)this.width=498;'' onmousewheel = ''javascript:return big(this)'' alt="" src="/uploadfile/201301/7/9A95414645.gif" />
说明:
1. HttpUtility.ParseQueryString(string)这个静态方法能帮助我们解析一个URL字符串,返回的结果也是NameValueCollection类型。
2. NameValueCollection是一个不区分大小写的集合。
HttpRequest有一个Cookies属性,MSDN给它的解释是:“获取客户端发送的 Cookie 的集合。”,这次MSDN的解释就不完全准确了。
请看如下代码:
- protected void Page_Load(object sender, EventArgs e)
- {
- string key = "Key1";
- HttpCookie c = new HttpCookie(key, DateTime.Now.ToString());
- Response.Cookies.Add(c);
- HttpCookie cookie = Request.Cookies[key];
- if( cookie != null )
- this.labResult.Text = cookie.Value;
- Response.Cookies.Remove(key);
- }
这段代码的运行结果就是【能显示当前时间】,我就不贴图了。
如果写成如下形式:
- protected void Page_Load(object sender, EventArgs e)
- {
- string key = "Key1";
- HttpCookie cookie = Request.Cookies[key];
- if( cookie != null )
- this.labResult.Text = cookie.Value;
- HttpCookie c = new HttpCookie(key, DateTime.Now.ToString());
- Response.Cookies.Add(c);
- Response.Cookies.Remove(key);
- }
此时就读不到Cookie了。这也提示我们:Cookie的读写次序可能会影响我们的某些判断。
HttpRequest还有二个用于方便获取HTTP数据的属性Params,Item ,后者是个默认的索引器。
这二个属性都可以让我们方便地根据一个KEY去【同时搜索】QueryString、Form、Cookies 或 ServerVariables这4个集合。通常如果请求是用GET方法发出的,那我们一般是访问QueryString去获取用户的数据,如果请求是用POST方法提交的,我们一般使用Form去访问用户提交的表单数据。而使用Params,Item可以让我们在写代码时不必区分是GET还是POST。这二个属性唯一不同的是:Item是依次访问这4个集合,找到就返回结果,而Params是在访问时,先将4个集合的数据合并到一个新