我正在使用ASP.NET路由将URL映射到我的站点的任意数量的部分。它们都将由同一页面处理,但我希望有不同的URL。例如
http://site.com/blog
我的blog
部分
http://site.com/mysection
等mysection
可以有任意数量的这些部分,但它们都将由Lister.aspx
处理。
我还有另一个处理内容的页面,名为ContentView.aspx
,显示内容。我的路线如下:(猫是类别列表)
cats.ForEach(c =>
{
table.Add(new Route(c.ShortName, new PageRouteHandler("~/Lister.aspx?cat=" + c.ID), ));
table.Add(new Route(c.ShortName + "/{id}", new PageRouteHandler("~/ContentView.aspx")));
table.Add(new Route(c.ShortName + "/{id}/{title}", new PageRouteHandler("~/ContentView.aspx")));
});
假设我的博客帖子标识为123
,标题为hello
:
用户可以通过http://site.com/blog/123/hello
访问它
他们也可以只使用ID http://site.com/blog/123
正如您可能猜到的,我希望http://site.com/blog
指向列表页面而不是内容查看器,我还需要类别ID来区分哪个类别(blog
或mycategory
或其他任何类别这是动态创建的)我应该显示。我正在尝试将类别ID传递给查询字符串,调用列表页面,但没有查询字符串。为什么会出现这种情况,以及如何将我的类别ID发送到列表页面?
答案 0 :(得分:1)
我建议您创建自己的RouteHandler来实现IRouteHandler,然后您可以将一个单独的参数传递给它的构造函数(类别ID)。
然后在GetHttpHandler中,您可以使用HttpContext将该ID传递给Page。
类似的东西:
public class CategoryRouteHandler : IRouteHandler
{
private string _virtualPath;
private string _category;
public CategoryRouteHandler(string virtualPath, string category)
{
_virtualPath = virtualPath;
_category = category;
}
public IHttpHandler GetHttpHandler(RequestContext requestContext)
{
var handler = BuildManager.CreateInstanceFromVirtualPath(
_virtualPath, typeof(Page)) as IDefaultHttpHandler;
HttpContext.Current.Items["Category"] = _category;
return handler;
}
}
然后你可以使用:
table.Add(new Route(c.ShortName, new CategoryRouteHandler("~/Lister.aspx", c.ID), ));
根据Lister的代码,您可以访问HttpContext.Current.Items["Category"]
修改:已更新以修复代码,抱歉我没有第一次测试。