2011-08-15 92 views
2

我正在使用ASP.NET路由將URL映射到我的網站的任意數量的節。他們都將被同一頁面處理,但我想要有不同的URL。例如ASP.NET路由傳遞查詢字符串到頁面

http://site.com/blogblog部分
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"))); 
     }); 

比方說,我有一個博客帖子ID爲123和標題hello
用戶可以通過http://site.com/blog/123/hello
訪問他們也可以只使用ID http://site.com/blog/123
您可能猜到,我想http://site.com/blog指向列表頁面而不是內容查看器,並且我還需要類別標識來區分哪個類別(blogmycategory或其他任何動態創建的)我應該顯示。我試圖將類別ID傳遞給querystring,調用lister頁面,但沒有查詢字符串。爲什麼會出現這種行爲,以及如何將我的類別ID發送到列表頁面?

回答

1

我會建議創建自己的RouteHandler實現IRouteHandler,然後你可以傳遞一個單獨的參數給它的構造函數(類別ID)。

然後在GetHttpHandler中,您可以使用HttpContext將該ID傳遞給頁面。

喜歡的東西:

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),)); 

而且從李斯特的代碼,你可以訪問HttpContext.Current.Items["Category"]

編輯:更新修復代碼,對不起,我第一次沒有測試它。

+0

你的代碼包含兩個錯誤:CategoryRouteHandler的基類是什麼,GetHttpHandler方法返回什麼?我試圖通過使用PageRouteHandler作爲基類並返回當前的IHttpHandler,但不能將值傳遞給頁面來使它工作。 –

+1

對不起,我編輯它,我認爲這應該工作。 – thelsdj