使用QueryStrings的.net 4.0路由

本文关键字:0路 net QueryStrings 使用 | 更新日期: 2023-09-27 18:22:30

我意识到有很多关于这个主题的文章和资源,但所有这些似乎都只展示了如何将查询字符串(如category=shoes)围绕url移动到不同的位置,如products/{category}

我有以下查询字符串:profile.aspx?q=98c2b15f-90c3-4a7f-a33f-0e34b106877e

我试图实现一个RoutHandler来查询DB以找到用户名,并创建一个类似于mydomain.com/usersname的url

这就是我尝试的(现在一切都是硬编码的,直到我开始工作为止)

void Application_Start(object sender, EventArgs e)
{
    RegisterRoute(System.Web.Routing.RouteTable.Routes);
}
void RegisterRoute(System.Web.Routing.RouteCollection routes)
{
    routes.Add("Profiles", new System.Web.Routing.Route("profile/{profile}", new RouteHandler()));
}

这是处理程序类:

public IHttpHandler GetHttpHandler(RequestContext requestContext)
{
    string username = requestContext.RouteData.Values["profile"] as string;
    HttpContext.Current.Items["q"] = "98c2b15f-90c3-4a7f-a33f-0e34b106877e";
    return BuildManager.CreateInstanceFromVirtualPath("~/pub/profile.aspx", typeof(Page)) as Page;
}

Profile.aspx实际上是在查找"q"查询字符串。使用上述设置,它找不到它。

我做错了什么?如何路由或重写url,使其美观+保留它,以便页面能够找到所需的查询字符串?

任何帮助都会很棒。提前谢谢。

使用QueryStrings的.net 4.0路由

第一件事-如果你使用的是.net framework 4,你不需要创建任何处理程序,你可以直接使用MapPageRoute方法来创建路由。

回答您的问题-use可以像下面这样在处理程序中使用foreach循环,而不是专门查找"profile"。

    foreach (var urlParm in requestContext.RouteData.Values)
         requestContext.HttpContext.Items[urlParm.Key] = urlParm.Value;
    return BuildManager.CreateInstanceFromVirtualPath(VirtualPath, typeof(Page)) as IHttpHandler

在您的路由页面中,您应该检查

    string userName = this.Context.Items["profile"].ToString();       // "userName" and is set as route parameters in Global.asax

您在RouteHandler构造函数中设置了VirtualPath

 RouteHandler(string virPath)
    {
        this.VirtualPath = virPath;
    }

有关更多信息,请参阅这些链接-http://www.codeproject.com/Articles/77199/URL-Routing-with-ASP-NET-4-0http://msdn.microsoft.com/en-us/library/ie/cc668201.aspx