一步步学会使用ASP.NET 4 WEB应用程序中使用URL Routing(翻译)
創建路由
路由就是將URL路徑映射到具體的物理文件。若要將路由添加到網站中,請使用 RouteCollection.MapPageRoute 方法將它們添加到RouteTable類的靜態Routes屬性。
將用于添加路由的方法添加到 Global.asax 文件中
-
如果網站還沒有 Global.asax 文件,請通過執行下列步驟添加一個這樣的文件:
-
右擊“解決方案資源管理器”中的 Web 項目,然后選擇“添加新項”。
-
選擇“全局應用程序類”,再單擊“添加”。
-
-
打開 Global.asax 文件。
-
在Application指令的后面,添加用于System.Web.Routing命名空間的Import指令,如下面的示例所示:
<%@ Import Namespace="System.Web.Routing" %>
-
在 Session_End方法的后面添加以下代碼:
void?RegisterRoutes(RouteCollection?routes)
{
}在下面的過程中,您將向此方法中添加用于創建路由的代碼。
-
在 Application_Start 方法中,調用RegisterRoutes添加路由規則,如下面的示例所示:
void?Application_Start(object?sender,?EventArgs?e)
{
????RegisterRoutes(RouteTable.Routes);
}
上面的過程添加了用于注冊路由的空方法。現在,將使用此方法將路由添加到網站中。
添加路由
-
在 RegisterRoutes 方法中,添加以下代碼:
routes.MapPageRoute("",
????"SalesReportSummary/{year}",
????"~/sales.aspx");
此代碼添加了一個未命名的路由,該路由具有URL匹配模式,該模式包含文本值“SalesReportSummary”和名為year的占位符(URL參數)。它將路由映射到名為 Sales.aspx 的文件。
-
在 RegisterRoutes 方法中,添加以下代碼:
routes.MapPageRoute("SalesRoute",
????"SalesReport/{locale}/{year}",
????"~/sales.aspx");此代碼添加名為SalesRoute的路由。如果對路由規則進行了命名,那么在下面創建了相同的路由規則的時候,可以使用名稱區分它們。
-
在 RegisterRoutes 方法中,添加以下代碼:
routes.MapPageRoute("ExpensesRoute",
????"ExpenseReport/{locale}/{year}/{*extrainfo}",
????"~/expenses.aspx",?true,
????new?RouteValueDictionary?{?
????????{?"locale",?"US"?},?
????????{?"year",?DateTime.Now.Year.ToString()?}?},
????new?RouteValueDictionary?{?
????????{?"locale",?"[a-z]{2}"?},?
????????{?"year",?@"\d{4}"?}?});
此代碼添加名為 ExpensesRoute 的路由。此路由包括一個普通匹配參數 extrainfo。此代碼將 locale 參數的默認值設置為“US”,將 year 參數的默認值設置為今年。約束指定 locale 參數必須由兩個字母字符組成year 參數必須由四個數字組成。
使用路由創建超鏈接
當向網頁中添加超鏈接時,如果希望指定路由 URL 而不是物理文件,則您有兩個選擇:
-
可以對路由URL進行硬編碼。
-
可以指定路由參數名稱和值,并讓 ASP.NET 生成對應的 URL。如有必要,還可以指定路由名稱,以便唯一標識路由。如果稍后更改路由URL規則,則必須更新所有硬編碼的URL,但是如果讓 ASP.NET生成URL,則始終自動生成正確的URL(除非模式中的參數已更改)。
在下面的過程中,將使用硬編碼 URL 的超鏈接添加到網頁。
創建硬編碼的 URL
-
在“Solution”中,右擊 Web 項目,然后單擊"Add Item”。
顯示"Add Item”對話框。
-
選擇“Web 窗體”模板,確保選中“Place code in separate file”,將名稱設置為“Links.aspx”,然后單擊“添加”。
即會在“源”視圖中打開Links.aspx頁。
-
在開始和結束 <div> 標記之間添加以下標記:
<asp:HyperLink?ID="HyperLink1"?runat="server"?
????NavigateUrl="~/salesreportsummary/2010">
????Sales?Report?-?All?locales,?2010
</asp:HyperLink>
<br?/>
<asp:HyperLink?ID="HyperLink2"?runat="server"?
????NavigateUrl="~/salesreport/WA/2011">
????Sales?Report?-?WA,?2011
</asp:HyperLink>
<br?/>
<asp:HyperLink?ID="HyperLink3"?runat="server"?
????NavigateUrl="~/expensereport">
????Expense?Report?-?Default?Locale?and?Year?(US,?current?year)
</asp:HyperLink>
<br?/>此標記中使用硬編碼URL創建三個HyperLink控件。第一個超鏈接匹配銷售情況匯總路由的URL模式,第二個超鏈接匹配名為 SalesRoute 的路由,第三個超鏈接匹配名為ExpensesRoute 的路由。由于沒有為第三個超鏈接的 URL 指定參數,為該路由定義的默認值將傳遞給Expenses.aspx。
接下來,將添加標記(這些標記創建用于指定路由參數和路由名稱的超鏈接)以創建路由URL。
使用標記創建自動生成的URL
-
在“源”視圖中保持Links.aspx 打開,在上一過程中創建的HyperLink控件后添加以下代碼:
<asp:HyperLink?ID="HyperLink4"?runat="server"?
????NavigateUrl="<%$RouteUrl:year=2011%>">
????Sales?Report?-?All?locales,?2011
</asp:HyperLink>
<br?/>
<asp:HyperLink?ID="HyperLink5"?runat="server"?
????NavigateUrl="<%$RouteUrl:locale=CA,year=2009,routename=salesroute%>">
????Sales?Report?-?CA,?2009
</asp:HyperLink>
<br?/>此標記使用 RouteUrl 表達式創建名為SalesSummaryRoute和SalesRoute的URL。第二個 RouteUrl 表達式指定路由的名稱,因為代碼中提供的參數列表可以匹配 ExpensesRoute URL模式或 SalesRoute URL模式。ExpensesRoute URL 模式具有 SalesRoute URL模式所沒有的 extrainfo 占位符,但是 extrainfo 是一個可用于放置各種信息的占位符,這意味著它是可選的。
在下面的過程中,將添加用于創建超鏈接的標記,并通過指定路由參數和路由名稱,使用代碼生成超鏈接的 URL。
使用代碼創建自動生成的 URL
-
在“源”視圖中保持 Links.aspx 打開,在上一過程中創建的 HyperLink控件后添加以下代碼:
<asp:HyperLink?ID="HyperLink6"?runat="server">
????Expense?Report?-?CA,?2008
</asp:HyperLink>
<br?/>此標記不設置 NavigateUrl 屬性,因為該屬性將在代碼運行時生成。
-
在“Solution”中,展開 Links.aspx,然后打開 或 Links.aspx.cs。
-
為 System.Web.Routing命名空間添加 using 語句,如下面的示例所示:
using System.Web.Routing;
-
在Page_Load方法中,添加以下代碼:
此代碼創建包含三個參數的 RouteValueDictionary 類的實例。第三個參數為 category,它不在 URL 模式中。由于它不在 URL 模式中,category 參數及其值將呈現為查詢字符串參數。
-
在上一步中添加的代碼后面,添加以下代碼:
VirtualPathData?vpd?=?
????RouteTable.Routes.GetVirtualPath(null,?"ExpensesRoute",?parameters);此代碼通過調用RouteCollection類的GetVirtualPath方法,實例化VirtualPathData對象。由于 SalesRoute URL 模式和 ExpensesRoute URL 模式具有相似的占位符,因此它調用接受路由名稱并指定 ExpensesRoute 值的重載。
-
在上一步中添加的代碼后面,添加以下代碼以設置超鏈接的 NavigateUrl 屬性:
HyperLink6.NavigateUrl = vpd.VirtualPath;
在 ASP.NET 頁中訪問 URL 參數值
在 ASP.NET 路由已調用的 ASP.NET 頁中,可以在標記或代碼中檢索 URL 參數的值。例如,SalesReport 路由包括名為 locale 和 year 的參數,當收到匹配此模式的 URL 請求時,Sales.aspx 頁中的代碼可能需要將這些參數的值傳遞給 SQL 查詢。
在下面的過程中,將使用標記訪問 URL 參數值。此方法可用于在網頁中顯示參數值。
使用標記訪問 URL 參數值
-
右擊 Web 項目,然后單擊“添加新項”。
顯示“添加新項”對話框。
-
選擇 Web 窗體模板,然后將名稱設置為“Expenses.aspx”。
即會在“源”視圖中打開 Expenses.aspx 頁。
-
在開始和結束 <div> 標記之間添加以下標記:
<h1>
????Expense?Report?for
????<asp:Literal?ID="Literal1"?
??????Text="<%$RouteValue:locale%>"?
??????runat="server"></asp:Literal>,
????<asp:Literal?ID="Literal2"?
??????Text="<%$RouteValue:year%>"?
??????runat="server"></asp:Literal>
</h1>此標記使用 RouteValue 表達式提取并顯示傳遞到頁面的 URL 參數的值。
在下面的過程中,將使用代碼訪問參數值。此方法在您必須以某種方式(例如通過按此過程所示將 null 值轉換為默認值,或通過將信息傳遞給 SQL 查詢)處理數據時非常有用。
使用代碼訪問 URL 參數值
-
右擊 Web 項目,然后單擊“Add New Item”。
顯示“New Item”對話框。
-
選擇“Web 窗體”模板,確保選中“將代碼放在單獨的文件中”,將名稱設置為“Sales.aspx”,然后單擊“添加”。
即會在“源”視圖中打開 Sales.aspx 頁。
-
在開始和結束 <div> 標記之間添加以下標記:
<h1>
????Sales?Report?for
????<asp:Literal?ID="LocaleLiteral"?runat="server"></asp:Literal>,
????<asp:Literal?ID="YearLiteral"?runat="server"></asp:Literal>
</h1>此標記包括 Literal 控件,但不設置其 Text 屬性,因為將在代碼中設置這些屬性。
-
在“Solution”中,展開 Sales.aspx,然后打開Sales.aspx.cs。
-
在 Page_Load 方法中,添加以下代碼,將第一個 Literal 控件的 Text 屬性設置為下列值之一:
-
文本“所有區域設置”(如果 locale 參數為 null)。
-
locale 參數的值(如果 locale 參數不為 null)。
LocaleLiteral.Text = Page.RouteData.Values["locale"] == null ?
"All locales" : Page.RouteData.Values["locale"].ToString();
-
-
在 Page_Load 方法中,添加以下代碼,以將第一個Literal控件的Text 屬性設置為 year URL 參數的值:
YearLiteral.Text = Page.RouteData.Values["year"].ToString();
測試路由
現在,可以測試路由。
測試路由
-
在“解決方案資源管理器”中右擊 Links.aspx,并選擇“在瀏覽器中查看”。
該頁將在瀏覽器中顯示,如下圖所示:
-
單擊每個超鏈接。
請注意,每個超鏈接轉到一個其標題對應于該超鏈接的文本的頁面。
-
回到 Links.aspx 頁,選擇瀏覽器的“查看源”命令,檢查最后三個超鏈接的 URL。
您將看到下面的自動生成的 URL:
-
http://[server]/[application]/SalesReportSummary/2011
-
http://[server]/[application]/SalesReport/CA/2009
-
http://[server]/[application]/ExpenseReport/CA/2008?category=recreation
-
-
將以 SalesReport/CA/2009 結束的 URL 復制到 Windows 剪貼板,然后關閉“查看源”窗口。
-
將該 URL 粘貼到瀏覽器的地址欄中,將 CA 更改為“invalidlocale”,將 2009 更改為“invalidyear”,然后按 Enter。
將顯示類似下圖的頁面:
您可以看到顯示 invalidlocale 和 invalidyear 值的銷售報表頁。由于沒有為 SalesRoute 路由指定任何約束,因此接受無效數據。
-
再次將該 URL 粘貼到瀏覽器的地址欄中,將 CA 更改為“invalidlocale”,將 2009 更改為“invalidyear”,將 SalesReport 更改為“ExpenseReport”,然后按 Enter。
將顯示類似下圖的頁面:
由于 URL 未解析為路由,您會看到“未找到”錯誤。ExpenseReport 路由將僅接受具有兩個字母字符的 locale 參數和具有四位數字的 year 參數。
原文鏈接
延伸閱讀
ASP.NET 4新增功能(一) ASP.NET核心服務
ASP.NET 4新增功能(二) ASP.NET Web 窗體增強功能
ASP.NET 4新增功能(三) 對Web標準的支持和輔助功能的增強
ASP.NET 4新增功能(四) 其它新功能及VS 2010對ASP.NET 4的支持改進(完)
轉載于:https://www.cnblogs.com/longgel/archive/2010/06/05/1752239.html
總結
以上是生活随笔為你收集整理的一步步学会使用ASP.NET 4 WEB应用程序中使用URL Routing(翻译)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 制作图片热点
- 下一篇: ChineseCalendar类[转]