我正在使用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+$" } });
我想我需要多一點的幫助來實現它。我試着將這個類添加到Global.asax中,按照你的建議分裂相關的URI和所有的,但是我不知道如何添加它。 (new AdBlahRoute(「ad/{cid}/{blah}」,new BlahRouteHandler()));'但是這不起作用,因爲''System.Web.Routing.Route'不包含一個構造函數,它接受0個參數「和」'ASP.global_asax。AdBlahRoute」不包含一個構造函數需要兩個參數」 – Jesper
所有線路必須命名(第一個參數) – jgauffin
這是正確的?: '公共類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