路由问题.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+$" } } );
创建一个新的路由类,它派生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;
}
}