路由问题.NET 4

路由问题.NET 4

问题描述:

我正在使用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+$" } }); 

创建一个新的路线类派生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