【问题标题】:Asp.net Routing Url conversion?Asp.net路由Url转换?
【发布时间】:2012-12-06 01:57:41
【问题描述】:

假设我有这个 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 那样将保罗的价值注入到 url 中:

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

在我的情况下:

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

【问题讨论】:

标签: c# asp.net url-rewriting routing


【解决方案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());

【讨论】:

  • 我的其他解决方案怎么样? (像 SO 一样将 id 注入到 URL 中)?
  • 你会创建一个自定义路由处理程序来做到这一点。
  • 你不清楚:-)。将 id 注入 url 时 - 我不需要扫描数据库。但是当只写保罗和扫描数据库时——这完全是另一回事。我该怎么办?
  • 看看dotnet.dzone.com/news/iroutehandler-aspnet-mvc,你会修改GetHttpHandler中的代码来执行Paul-to-2的转换,并使用正确的参数加载asp页面。
  • Sorry.:-) 但我将如何在网络表单示例中做到这一点? ( 在哪里)。谢谢。
猜你喜欢
  • 1970-01-01
  • 2010-11-22
  • 2011-06-05
  • 2010-11-13
  • 2011-07-30
  • 1970-01-01
相关资源
最近更新 更多