ASP.NET路由将查询字符串传递给页面

时间:2011-08-15 00:50:51

标签: asp.net query-string url-routing

我正在使用ASP.NET路由将URL映射到我的站点的任意数量的部分。它们都将由同一页面处理,但我希望有不同的URL。例如

http://site.com/blog我的blog部分 http://site.com/mysectionmysection

可以有任意数量的这些部分,但它们都将由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来区分哪个类别(blogmycategory或其他任何类别这是动态创建的)我应该显示。我正在尝试将类别ID传递给查询字符串,调用列表页面,但没有查询字符串。为什么会出现这种情况,以及如何将我的类别ID发送到列表页面?

1 个答案:

答案 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"]

修改:已更新以修复代码,抱歉我没有第一次测试。