我意识到这个主题上有大量的文章和资源,但似乎只显示如何将网址周围的查询字符串如 category = shoes 移动到不同的地方,例如此产品/ {category}
我有以下查询字符串: profile.aspx?q = 98c2b15f-90c3-4a7f-a33f-0e34b106877e
我正在尝试实施RoutHandler来查询数据库以查找用户名并创建一个网址,例如 mydomain.com/usersname
这是我试过的(现在一切都是硬编码,直到我开始工作):
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”查询字符串。并且通过上述设置,它找不到它。
我做错了什么?我如何路由或重写网址,以便它非常+保持它,以便页面可以找到它需要的查询字符串?
任何帮助都会很棒。提前谢谢。
答案 0 :(得分:0)
第一件事 - 如果你使用.net框架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-0 http://msdn.microsoft.com/en-us/library/ie/cc668201.aspx