2013-09-28 111 views
3

我有以下順序路由規則:我使用ASP.NET Web窗體路由歧義

routes.MapPageRoute("Corporate", "Shop/{Category}", "~/Shop.aspx"); 
routes.MapPageRoute("GiftType", "Shop/{Category}", "~/Shop.aspx"); 
routes.MapPageRoute("Occasion", "Shop/{Category}", "~/Shop.aspx"); 
routes.MapPageRoute("Discounted", "Shop/{Category}", "~/Shop.aspx"); 
routes.MapPageRoute("Featured", "Shop/{Featured}", "~/Shop.aspx"); 

鏈接:

<a href="~/Shop/Corporate" title="Corporate Gifts" runat="server">Corporate</a> 
<a href="~/Shop/GiftType" title="Shop by Gift Type" runat="server">Gift Type</a> 
<a href="~/Shop/Occasion" title="Shop by Occasion" runat="server">Occasion</a> 
<a href="~/Shop/Discounted" title="Discounted" runat="server">Discounted</a> 
<a href='<%# "~/Shop/"+Eval("Featured") %>' title='<%# Eval("ProductName") %>' 
    runat="server"> 

在目標頁面的代碼隱藏中,下面的代碼作品,我不知道爲什麼。 switch語句針對「精選」執行的案例值爲「True」?這就像我沒有根據佔位符區分這些路線彼此?

if (Page.RouteData.Values["Category"] != null) 
{ 
    string category = Page.RouteData.Values["Category"].ToString(); 

    switch (category) 
    { 
     case ("Corporate"): 
      Response.Write("Corporate"); 
      break; 
     case ("GiftType"): 
      Response.Write("GiftType"); 
      break; 
     case ("Occasion"): 
      Response.Write("Occasion"); 
      break; 
     case ("Discounted"): 
      Response.Write("Discounted"); 
      break; 
     // Do not want the following to be picked up here for Category param 
     case ("True"): 
      Response.Write("Featured"); 
      break;   
    } 
} 

我想要什麼工作代碼明智的是這樣的:

if (Page.RouteData.Values["Category"] != null) 
    { 
     string category = Page.RouteData.Values["Category"].ToString(); 

     switch (category) 
     { 
      case ("Corporate"): 
       Response.Write("Corporate"); 
       break; 
      case ("GiftType"): 
       Response.Write("GiftType"); 
       break; 
      case ("Occasion"): 
       Response.Write("Occasion"); 
       break; 
      case ("Discounted"): 
       Response.Write("Discounted"); 
       break;   
     } 
    } 
    else if (Page.RouteData.Values["Featured"].ToString() == "True") 
    { 
     Response.Write("Featured"); 
    } 
+1

它應該只需要1個MapPageRoute調用,他們中的任何一個都可以。當你摸不清頭腦的時候,弄清楚如何完成剩下的工作可能會更容易一些。另一個提示:使用Glimpse來確定路由如何執行。 HTH – LosManos

+0

Glimpse是否可以使用Web窗體?認爲這只是MVC ... – IrishChieftain

+0

也許只有MVC是的;沒有想到這一點。 – LosManos

回答

2

你只需要爲你的類別之一路線:

routes.MapPageRoute("shop-categories", "Shop/{Category}", "~/Shop.aspx"); 

然後你就可以建立網址像你一樣,或者像

<a id="a1" href="<%$ RouteUrl:Category=Discounted,routename=shop-categories%>" title="Discounted" runat="server">Discounted</a> 

我想你想要的功能不同的路線(爲清晰起見),像

routes.MapPageRoute("featured", "Shop/Featured/{Featured}", "~/Shop.aspx"); 

與線路(雙向):

<a id="A2" href="<%$ RouteUrl:Featured=False,routename=featured%>" title="Featured" runat="server">Featured False</a> 
<a id="A3" href="~/Shop/Featured/True" title="Featured" runat="server">Featured True</a> 

然後你的後臺代碼:

if (Page.RouteData.Values["Category"] != null) 
{ 
    //something 
} 
else if (Page.RouteData.Values["Featured"] != null) 
{ 
    //something 
} 

建立像我所顯示的鏈接的好處是,如果你決定改變你的路線......你不會破壞任何東西。比方說,你最終不喜歡URL /Shop/Featured/的外觀,只是希望它是/Featured/,讓你改變你的路線:

routes.MapPageRoute("featured", "Featured/{Featured}", "~/Shop.aspx"); 

現在,在我上面的例子中,與id="A2"鏈接仍然可以工作,而id="A3"現在已損壞。

+1

謝謝Mike,很好的回答:-) – IrishChieftain