0

假设我有这个 sql server 表:

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时,他怎么知道它知道 Paul 的值是2?

你是在告诉我每次asp.net遇到Paul他应该去数据库并扫描一个预定义的唯一列(Name在这种情况下)并获取它的列ID值吗?

或者我应该像 SO 那样将 Paul 的价值注入到 url 中:

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

在我的情况下:

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

4

1 回答 1

1

Asp.net 本质上并不知道 Paul 的 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());
于 2012-12-18T19:42:13.637 回答