路由问题.net 4

本文关键字:net 问题 路由 | 更新日期: 2023-09-27 18:13:28

我使用路由通过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");

但是现在的问题是,当客户端到这个url: http://www.website.com/ad/123时,请求像http://www.website.com/ad/scripts/scriptfile.js这样的javascript,这使得路由认为它是一个广告号和一些'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);

但是现在我得到一个404如果我请求http://www.website.com/ad/123/sometext

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

---- EDIT ----

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 ------

只是谷歌的,我已经找到了一行的解决方案,我不需要处理程序或类,因为它似乎。

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

路由问题.net 4

创建一个新的路由类,它派生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;
    }
}