我们在开发网页应用程序,时常需要去解析网址(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#toc
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.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();
}