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