我们在开发网页应用程式,时常需要去解析网址(Request.Url)的每个片段,进行一些判断。例如说"http://localhost:1897/News/Press/Content.aspx/123?id=1#toc",我们想要取得网址里第一层目录的名字(News)用以判断不同的页面标题( Page Title)。
我看很多人都用字串的IndexOf 方法与Substring 方法:
Request.Url.PathAndQuery.Substring(1, Request.Url.PathAndQuery.IndexOf("/", 1)-1)
这实在太埋没.NET 的强大设计了,事实上在Request 物件就已经提供很多方便的属性(Property)可供取得网址的片段。
底下这张表就是各种跟Browser Request 的网址相关的属性与用法:
網址:http://localhost:1897/News/Press/Content.aspx/123?id=1 | |
Request.ApplicationPath | / |
Request.PhysicalPath | D:\Projects\Solution\web\News\Press\Content.aspx |
System.IO.Path.GetDirectoryName(Request.PhysicalPath) | D:\Projects\Solution\web\News\Press |
Request.PhysicalApplicationPath | D:\Projects\Solution\web\ |
System.IO.Path.GetFileName(Request.PhysicalPath) | Content.aspx |
Request.CurrentExecutionFilePath | /News/Press/Content.aspx |
Request.FilePath | /News/Press/Content.aspx |
Request.Path | /News/Press/Content.aspx/123 |
Request.RawUrl | /News/Press/Content.aspx/123?id=1 |
Request.Url.AbsolutePath | /News/Press/Content.aspx/123 |
Request.Url.AbsoluteUri | http://localhost:1897/News/Press/Content.aspx/123?id=1 |
Request.Url.Scheme | http |
Request.Url.Host | localhost |
Request.Url.Port | 1897 |
Request.Url.Authority | localhost:1897 |
Request.Url.LocalPath | /News/Press/Content.aspx/123 |
Request.PathInfo | /123 |
Request.Url.PathAndQuery | /News/Press/Content.aspx/123?id=1 |
Request.Url.Query | ?id=1 |
Request.Url.Fragment | |
Request.Url.Segments | /News/Press/Content.aspx/123 |
Request.QueryString["id"] | 1 |
所以当你看了这张表之后,你还会想用Request.Url.PathAndQuery.Substring(1, Request.Url.PathAndQuery.IndexOf("/", 1)-1) 这种写法吗?
用这样写Request.Url.Segments[1].Replace("/", "") 不是又短又直觉吗? ^_^
以下是产生以上表格的程式码:
protected void Page_Load(object sender, EventArgs e) { StringBuilder sb = new StringBuilder(); sb.Append("<table cellpadding=3 cellspacing=0 border=1>"); sb.Append("<tr><td colspan=2>"); sb.Append("网址:"http://localhost:1897/News/Press/Content.aspx/123?id=1#toc">http://localhost:1897/News/Press/Content.aspx/123 ?id=1#toc"); sb.Append("</td></tr>"); // Request.ApplicationPath sb.Append("<tr><td>"); sb.Append("Request.ApplicationPath"); sb.Append("</td><td>"); sb.Append("<b>" + Request.ApplicationPath + "</b>"); sb.Append("</td></tr>"); // Request.PhysicalPath sb.Append("<tr><td>"); sb.Append("Request.PhysicalPath"); sb.Append("</td><td>"); sb.Append("<b>" + Request.PhysicalPath + "</b>"); sb.Append("</td></tr>"); // System.IO.Path.GetDirectoryName(Request.PhysicalPath) sb.Append("<tr><td>"); sb.Append("System.IO.Path.GetDirectoryName(Request.PhysicalPath)"); sb.Append("</td><td>"); sb.Append("<b>" + System.IO.Path.GetDirectoryName(Request.PhysicalPath) + "</b>"); sb.Append("</td></tr>"); // Request.PhysicalApplicationPath sb.Append("<tr><td>"); sb.Append("Request.PhysicalApplicationPath"); sb.Append("</td><td>"); sb.Append("<b>" + Request.PhysicalApplicationPath + "</b>"); sb.Append("</td></tr>"); // System.IO.Path.GetFileName(Request.PhysicalPath) sb.Append("<tr><td>"); sb.Append("System.IO.Path.GetFileName(Request.PhysicalPath)"); sb.Append("</td><td>"); sb.Append("<b>" + System.IO.Path.GetFileName(Request.PhysicalPath) + "</b>"); sb.Append("</td></tr>"); // Request.CurrentExecutionFilePath sb.Append("<tr><td>"); sb.Append("Request.CurrentExecutionFilePath"); sb.Append("</td><td>"); sb.Append("<b>" + Request.CurrentExecutionFilePath + "</b>"); sb.Append("</td></tr>"); // Request.FilePath sb.Append("<tr><td>"); sb.Append("Request.FilePath"); sb.Append("</td><td>"); sb.Append("<b>" + Request.FilePath + "</b>"); sb.Append("</td></tr>"); // Request.Path sb.Append("<tr><td>"); sb.Append("Request.Path"); sb.Append("</td><td>"); sb.Append("<b>" + Request.Path + "</b>"); sb.Append("</td></tr>"); // Request.RawUrl sb.Append("<tr><td>"); sb.Append("Request.RawUrl"); sb.Append("</td><td>"); sb.Append("<b>" + Request.RawUrl + "</b>"); sb.Append("</td></tr>"); // Request.Url.AbsolutePath sb.Append("<tr><td>"); sb.Append("Request.Url.AbsolutePath"); sb.Append("</td><td>"); sb.Append("<b>" + Request.Url.AbsolutePath + "</b>"); sb.Append("</td></tr>"); // Request.Url.AbsoluteUri sb.Append("<tr><td>"); sb.Append("Request.Url.AbsoluteUri"); sb.Append("</td><td>"); sb.Append("<b>" + Request.Url.AbsoluteUri + "</b>"); sb.Append("</td></tr>"); // Request.Url.Scheme sb.Append("<tr><td>"); sb.Append("Request.Url.Scheme"); sb.Append("</td><td>"); sb.Append("<b>" + Request.Url.Scheme + "</b>"); sb.Append("</td></tr>"); // Request.Url.Host sb.Append("<tr><td>"); sb.Append("Request.Url.Host"); sb.Append("</td><td>"); sb.Append("<b>" + Request.Url.Host + "</b>"); sb.Append("</td></tr>"); // Request.Url.Port sb.Append("<tr><td>"); sb.Append("Request.Url.Port"); sb.Append("</td><td>"); sb.Append("<b>" + Request.Url.Port + "</b>"); sb.Append("</td></tr>"); // Request.Url.Authority sb.Append("<tr><td>"); sb.Append("Request.Url.Authority"); sb.Append("</td><td>"); sb.Append("<b>" + Request.Url.Authority + "</b>"); sb.Append("</td></tr>"); // local Request.Url.LocalPath sb.Append("<tr><td>"); sb.Append("Request.Url.LocalPath"); sb.Append("</td><td>"); sb.Append("<b>" + Request.Url.LocalPath + "</b>"); sb.Append("</td></tr>"); // Request.PathInfo sb.Append("<tr><td>"); sb.Append("Request.PathInfo"); sb.Append("</td><td>"); sb.Append("<b>" + Request.PathInfo + "</b>"); sb.Append("</td></tr>"); // Request.Url.PathAndQuery sb.Append("<tr><td>"); sb.Append("Request.Url.PathAndQuery"); sb.Append("</td><td>"); sb.Append("<b>" + Request.Url.PathAndQuery + "</b>"); sb.Append("</td></tr>"); // Request.Url.Query sb.Append("<tr><td>"); sb.Append("Request.Url.Query"); sb.Append("</td><td>"); sb.Append("<b>" + Request.Url.Query + "</b>"); sb.Append("</td></tr>"); // Request.Url.Fragment // 原则上你应该无法从Request.Url.Fragment 取得任何资料,因为通常Browser 不会送出#toc 这个部分 sb.Append("<tr><td>"); sb.Append("Request.Url.Fragment"); sb.Append("</td><td>"); sb.Append("<b>" + Request.Url.Fragment + "</b>"); sb.Append("</td></tr>"); // Request.Url.Segments sb.Append("<tr>"); sb.Append("<td>"); sb.Append("Request.Url.Segments"); sb.Append("</td>"); sb.Append("<td>"); string[] segments = Request.Url.Segments; foreach (string s in segments) { sb.Append("<b>" + s + "</b>"); sb.Append("<br/>"); } sb.Append("</td>"); sb.Append("</tr>"); sb.Append("</table>"); ltlTable.Text = sb.ToString(); }
注意事项
当程式部署(Deploy)到IIS 6 之后,假设你的网址是http://localhost:1897/News/Press/Content.aspx/123? ,IIS 不知为何会将问号( ? ) 给删除掉,以致于ASP.NET 使用Request.Url.Query 是空字串!如果你的程式有判断到这部分时就要特别注意,因为照理说应该会抓到才对!不知道是不是 IIS 6 的 Bug ?