2010年12月19日 星期日

.NET 4 URL Routing

ASP.NET 4中,有一個新的URL Routing的功能,可讓我們很方便的自由設定我們想要的URL格式,例如:
http://yourWebSite/search.aspx?key=WPF7

透過URL Routing,網址列可變成

http://yourWebSite/search/WPF7


http://yourWebSite/employee.aspx?country=UK&city=London
透過URL Routing,網址列可變成

http://yourWebSite/employee/UK/London


然後利用URL Routing的機制,系統會自動對應與攜帶參數到指定的實際程式中去執行,以下就介紹5種URL Routing的使用方式與範例。

首先我們建立一個Web Application,並且在Site.Master中設計幾個選單,每一個選單點下去,就透過Global.asax.cs,分別對應出各種URL Routing的使用方式。整個範例結果看起來如下:




在Site.Master中我們先撰寫每個menu、URL與參數值


   1:  <asp:Menu ID="NavigationMenu" runat="server" >
   2:    <Items>
   3:        <asp:MenuItem NavigateUrl="~/" Text="Home"/>
   4:        <asp:MenuItem NavigateUrl="~/About" Text="About"/>
   5:        <asp:MenuItem NavigateUrl="~/product/" Text="Product"/>                        
   6:        <asp:MenuItem NavigateUrl="~/search/hello" Text="Search"/>
   7:        <asp:MenuItem NavigateUrl="~/users/MarkLin" Text="User"/>   
   8:        <asp:MenuItem NavigateUrl="~/employee/UK/London/HoraceLin"
   9:                                 Text="Employee"/>
  10:    </Items>
  11:  </asp:Menu>

在Global.asax.cs中,我們要引用using System.Web.Routing,並且在RegisterRoutes這個Method中,寫入下列程式,分別表示使用者瀏覽器端輸入的各種URL,我們這邊該如何對應到真實的程式中。


   1:   
   2:  void RegisterRoutes(RouteCollection routes)
   3:  {
   4:      RouteTable.Routes.MapPageRoute("HomeRoute", "Home",
   5:                    "~/Default.aspx");
   6:      RouteTable.Routes.MapPageRoute("AboutRoute", "About",
   7:                    "~/About.aspx");
   8:      RouteTable.Routes.MapPageRoute("ProductRoute", "product",
   9:                    "~/product.aspx");            
  10:      RouteTable.Routes.MapPageRoute("SearchRoute",
  11:                  "search/{searchterm}", "~/search.aspx");
  12:      RouteTable.Routes.MapPageRoute("UserRoute",
  13:                  "users/{username}", "~/users.aspx");
  14:      RouteTable.Routes.MapPageRoute("EmployeeRoute",
  15:                  "employee/{country}/{city}/{name}", 
  16:                  "~/employee.aspx");
  17:      RouteTable.Routes.MapPageRoute("LoginRoute", "Login",
  18:                    "~/Account/Login.aspx");
  19:  }

RouteTable.Routes.MapPageRoute()之內基本上帶有4個参數,為了說明,本範例只帶前3個参數:

RouteTable.Routes.MapPageRoute(
    路徑名稱,
    路徑URL格式,
    對應實體的程式URL,
    (option)是否應該驗證使用者是否已獲得授權可存取實體 URL)


1.URL Routing with no param.


我們按下範例中的「Home」、「About」、「Product」選單與右上角的「Login In」連結(因在最右邊,Cut圖沒有出現),URL分別為「http://website/Home」、「http://website/About」、「http://website/product」與「http://website/Login」,透過Global.asax.cs中URL Routing機制,分別對應實際程式「Default.aspx」、「About.aspx」、「About.aspx」、「product.aspx」與「/Account/Login.aspx」,如下圖所示點選單後的畫面(請注意網址列的URL):





2.URL Routing + parms. + Page.RouteData.Values[]


我們按下範例中的「Search」選單,如Site.Master程式所述,這裡假設帶一個参數值hello,所以URL:「http://website/search/hello」,透過Global.asax.ca中URL Routing Format:search/{searchterm},{searchterm}即為參數名稱,分別對應實際程式search.aspx,並在search.aspx.cs撰寫如下程式:


   1:  protected void Page_Load(object sender, EventArgs e)
   2:  {
   3:     Result.Text = Page.RouteData.Values["searchterm"].ToString();
   4:  }

我們使用Page.RouteData.Values["參數名稱"]來承接參數值,並顯示在網頁控制項label=Result上,如下圖(請注意網址列的URL):



3.URL Routing + parms. + RouteUrl:RouteName


我們按下範例中的「Search」選單後,在search.aspx網頁中也撰寫如下連結:


   1:  <asp:HyperLink ID="HyperLink1" runat="server" 
   2:      NavigateUrl="<%$RouteUrl:RouteName=SearchRoute,
   3:      searchterm=scott%>">
   4:      Demo Routing : Search for Scott
   5:  </asp:HyperLink> 

上述RouteName後面即利用在Global.asax.cs中之前已經寫好的路徑名稱SearchRoute,後面接searchterm這個参數與參數值scott:


   1:  RouteTable.Routes.MapPageRoute("SearchRoute",
   2:       "search/{searchterm}",
   3:       "~/search.aspx");


所以URL為「http://website/search/scott」,透過Global.asax.cs中URL Routing Format:search/{searchterm}對應實際程式search.aspx,並顯示在網頁控制項label=Result上,如下圖(請注意網址列的URL):



4.URL Routing + parms. + RouteValue


如同上小段,URL也是帶一個参數,只是這裡是用RouteValue的與法來承接參數值。我們按下範例中的「User」選單,如Site.Master程式所述,這裡假設帶一個参數值MarkLin,所以URL為「http://website/users/MarkLin」,透過Global.asax.cs中URL Routing Format:users/{username},{username}即為參數名稱,分別對應實際程式users.aspx如下程式:


   1:  <p><asp:Label ID="Result" runat="server" Text=
   2:       "<%$RouteValue:username%>" CssClass="msg"/>
   3:  </p>

我們使用 RouteValue:參數名稱 來承接參數值,並顯示在網頁控制項label=Result上,如下圖(請注意網址列的URL):



5.URL Routing + multi parms. + RouteValue


我們按下範例中的「Employee」選單,如Site.Master程式所述,這裡假設帶3個参數值UK、London與HoraceLin,所以URL:「http://website//employee/UK/London/HoraceLin」,透過Global.asax.cs中URL Routing Format:employee/{country}/{city}/{name},{country}{city}{name}即為參數名稱,分別對應實際程式employee.aspx,並在employee.aspx撰寫如下程式:


   1:  <h2>Employee Information</h2> 
   2:  <p>
   3:  Country : <asp:Label runat="server" Text=
   4:                "<%$RouteValue:country%>"
   5:                CssClass="msg1"/><br />
   6:  City     : <asp:Label runat="server" Text=
   7:               "<%$RouteValue:city%>"
   8:                CssClass="msg1"/><br />
   9:  Name     : <asp:Label runat="server" Text=
  10:               "<%$RouteValue:name%>"
  11:                CssClass="msg1"/>
  12:  </p>

我們使用 RouteValue:參數名稱 來承接參數值,並顯示在網頁如下圖(請注意網址列的URL):


沒有留言:

張貼留言