路由问题.NET 4

时间:2011-11-03 04:50:21

标签: c# asp.net .net routing

我正在使用Global.asax进行路由。

我希望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()));

现在我也想“装饰”这个URL,所以我想要这样的东西:

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时,请求javascripts,如http://www.website.com/ad/scripts/scriptfile.js,这使路由认为它是一个广告编号和一些'blah'并重定向到ad.aspx。

所以我需要以某种方式告诉路由,如果cid不是一个数字(因为它是一个文件夹)或者blah以.js或.css结尾,那么就不要路由。

我试过了:

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

但是如果我请求http://www.website.com/ad/123/sometext

,现在我得到404

我希望有人可以帮我解决这个问题。

----编辑----

BTW,这是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;
        }   
    }

------ ADDED ------

对于Google员工,我找到了一个单行解决方案,我似乎不需要处理程序或类。这条线就行了:

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

1 个答案:

答案 0 :(得分: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;
    }
}