2011-11-03 117 views
2

我正在使用Global.asax路由。路由問題.NET 4

我想http://www.website.com/ad/123導致http://www.website.com/ad.aspx?id=123

這是工作正常使用:

routes.MapPageRoute("AdById", "ad/{cid}", "~/ad.aspx"); 

我不得不「去路線」的JS和CSS文件和圖像,所以我有一些處理程序即:

routes.Add("AdImagesRoute", new Route("ad/graphics/{filename}.{ext}", new ImageRouteHandler())); 
routes.Add("AdJSRoute", new Route("ad/scripts/{filename}.js", new JSRouteHandler())); 
routes.Add("AdCSSRoute", new Route("ad/styles/{filename}.css", new CSSRouteHandler())); 

現在我也想「裝飾」的網址,所以我想是這樣的:

http://www.website.com/ad/123/House%20For%20Sale

也導致http://www.website.com/ad.aspx?id=123

,所以我說這一個:

routes.MapPageRoute("AdByIdWithBlah", "ad/{cid}/{blah}", "~/ad.aspx"); 

但現在的問題是,當客戶進入這個網址:http://www.website.com/ad/123,被請求的JavaScript像http://www.website.com/ad/scripts/scriptfile.js這使得路由認爲它是一個廣告號碼和一些'胡說',並重定向到ad.aspx。

所以我需要以某種方式告訴路由,如果cid不是數字(因爲它是一個文件夾),或者以.js或.css結尾,那麼就不要路由。

我嘗試這樣做:

Route adwithblahroute = new Route("ad/{cid}/{blah}", new RouteValueDictionary() {{"blah", "blah"}} , new RouteValueDictionary() { { "cid", @"^\d+$" }, {"blah", @"^[^.]$"} }, new BlahRouteHandler()); 
routes.Add(adwithblahroute); 

但現在我得到一個404,如果我要求http://www.website.com/ad/123/sometext

我希望有人能幫助我解決這個問題。

---- ----編輯

順便說一句,這是BlahRouteHandler:

public class BlahRouteHandler : IRouteHandler 
    { 
     public IHttpHandler GetHttpHandler(RequestContext requestContext) 
     { 
      int cid = 0; 
      string filepath; 
      if (Int32.TryParse(requestContext.RouteData.Values["cid"] as string, out cid)) 
      { 
       filepath = requestContext.HttpContext.Server.MapPath("~/ad.aspx"); 
       requestContext.HttpContext.Response.WriteFile(filepath); 
       requestContext.HttpContext.Response.End(); 
      } 
      else 
      { 
       requestContext.HttpContext.Response.Clear(); 
       requestContext.HttpContext.Response.StatusCode = 404; 
       requestContext.HttpContext.Response.End(); 
      } 
      return null; 
     } 
    } 

------ ------的新增

只是爲了Google'rs,我找到了一條線路解決方案,就像看起來,我不需要處理程序或類。這條線的伎倆:

routes.MapPageRoute("AdByIdWithBlah", "ad/{cid}/{blah}", "~/ad.aspx", false, new RouteValueDictionary() { { "blah", "blah" } }, new RouteValueDictionary() { { "cid", @"^\d+$" } }); 

回答

1

創建一個新的路線類派生Route,只有實現它的路線匹配(讓基處理一切)。

通過這樣做,您可以檢查第二個路徑部分是否真的是一個數字。

然後,只需將其添加爲詞典中的第一條路線。

public class MyCustomRoute : Route 
{ 
    public override RouteData GetRouteData(HttpContextBase httpContext) 
    { 
     var url = httpContext.Request.ApplicationPath.TrimEnd('/'); 
     var relativeUri = httpContext.Request.Url.AbsolutePath.Remove(0, url.Length); 

     // split url here 
     // return null if the second path part is not a number 
     // else invoke base.GetRouteData 
     return null; 
    } 
} 
+0

我想我需要多一點的幫助來實現它。我試着將這個類添加到Global.asax中,按照你的建議分裂相關的URI和所有的,但是我不知道如何添加它。 (new AdBlahRoute(「ad/{cid}/{blah}」,new BlahRouteHandler()));'但是這不起作用,因爲''System.Web.Routing.Route'不包含一個構造函數,它接受0個參數「和」'ASP.global_asax。AdBlahRoute」不包含一個構造函數需要兩個參數」 – Jesper

+0

所有線路必須命名(第一個參數) – jgauffin

+0

這是正確的?: '公共類AdBlahRoute:路線 { 公衆覆蓋的RouteData GetRouteData(HttpContextBase的HttpContext) {VAR url = httpContext.Request.ApplicationPath.TrimEnd('/'); var relativeUri = httpContext.Request.Url.AbsolutePath.Remove(0,url.Length); string [] urlparts = relativeUri.Split('/') ; 嘗試 { Convert.ToInt32(urlparts [1]); 返回base.GetRouteData(HttpContext的); } 捕獲 { 返回null; } } }' – Jesper