2012-12-18 132 views
0

比方說我有這樣的SQL Server表:Asp.net路由網址轉換?

id Name  Band 
-------------------- 
1 John  Beatles 
2 Paul  Beatles 
3 George Beatles 
4 Ringo  Beatles 
5 Jim  Doors 

我想有一個人詳細信息頁面,如:

http://localhost/Music/Beatles/Paul

,我想對待是:

http://localhost/Details.aspx?id=2

所以,我正在寫這個代碼來註冊一個簡單的路線:

void Application_Start(object sender, EventArgs e) 
{ 
    RouteTable.Routes.MapPageRoute("MyRoute", "Music/{Band}/{Name}", "~/Details.aspx"); 
} 

但我不明白:

當Asp.net得到http://localhost/Music/Beatles/Paul如何沒有他知道知道,保羅的價值是2

你是否告訴我,每當asp.net遇到Paul他應該去DB和掃描預定義的唯一列(在這種情況下爲Name),並得到它的列ID值?

或者我應該注入保羅的值到URL,像這樣做:

http://stackoverflow.com/questions/13938994/jquery-conditional-validation-based-on-select-text 
            ^
             | 
--------------------------------------- 

這將是我的情況:

http://localhost/Music/Beatles/2/Paul

+0

你應該看看AttributeRouting的代碼示例。 https://github.com/mccalltd/AttributeRouting –

回答

1

Asp.net不intrinsicly知道保羅的ID是2

你必須自己寫這個邏輯。你可以編寫你自己的RouteHandler並自己做路由(這將做db調用來確定正確的ID)。

就我個人而言,我只是讓aspx頁面處理信息本身,而不是假定它被賦予一個實際的ID。

這裏有一個自定義的路由處理(從Friendly URLs for ASP.NET拍攝)

public class CustomRouteHandler : IRouteHandler 
{ 
    public IHttpHandler GetHttpHandler(RequestContext requestContext) 
    { 
     string virtualPath = "~/path/to/page.aspx"; 

     int id; 

     // this would obviously be some sort of database call 
     if (requestContext.RouteData.Values["Name"] == "Paul") 
     { 
      id = 2; 
     } 
     else 
     { 
      id = 8675309; 
     } 

     string newPath = string.Format(
      "{0}?id={1}", 
      virtualPath, 
      id 
     ); 


     HttpContext.Current.RewritePath(newPath); 

     return BuildManager.CreateInstanceFromVirtualPath(virtualPath, typeof(Page)) as IHttpHandler; 
    } 
} 

並登記的路線

RouteTable.Routes.Add("MyCustomRoute", new Route("Music/{Band}/{Name}", new CustomRouteHandler()); 
+0

我的其他解決方案呢? (像SO這樣將URL注入到URL中)? –

+1

你會做一個自定義的路由處理程序來做到這一點。 – Matthew

+0

你不清楚:-)。當注入到網址的ID - 我不需要掃描數據庫。但是隻寫保羅和掃描數據庫 - 這完全是另一回事。我該怎麼辦 ? –