2012-12-18 58 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 - 我不需要扫描数据库。但是只写保罗和扫描数据库 - 这完全是另一回事。我该怎么办 ? –