2009-08-28 36 views
1

是否有文章解釋路由匹配如何工作以及它的能力?ASP.NET MVC路由捕獲全部

例如,我怎麼會寫趕上一切的路線,使:

/ 
/something 
/something/else 
/something/else/again 

都得到映射到相同的控制器動作,與URL作爲參數傳遞?

{*anything} 

以上似乎並不奏效。它可以不處理參數內的斜槓嗎?

回答

3

下面的代碼捕獲幾乎一切。

http://www.mysite.com/ 

例如將仍然被路由到Default.aspx的,我想。但像

http://www.mysite.com/some/page/that/doesnt/exist

將由TestRouteHandler捕獲。 {* fields}路由說明符應在傳遞給路由器的RequestContext.RouteData對象中結束,以便您可以執行任何您想要的操作。然而,在那個時候,你基本上正在實現一個重寫引擎。

public class Routes 
{ 
    public static void Register(RouteCollection routes) 
    { 
     // setup legacy url routing 
     routes.Add(new Route("{*fields}",new TestRouteHandler())); 
    } 
} 

public class TestRouteHandler : IRouteHandler 
{ 
    public virtual IHttpHandler GetHttpHandler(RequestContext requestContext) 
    { 
     Page page = BuildManager.CreateInstanceFromVirtualPath("/default.aspx", typeof(Page)) as Page; 
     return page; 
    } 

} 

或者,你可以指定喜歡

routes.Add(new Route("dave/{*fields}",new TestRouteHandler())); 

頂級路線,這將趕上類的物品。

http://www.mysite.com/dave 
http://www.mysite.com/dave/test/parameter 
http://www.mysite.com/dave/virtually/infinite/number/of/items/goes/here 
+0

我這樣做,但它沒有工作,現在它是:更奇怪。肯定是那些星期五的時刻之一!謝謝澄清 –

1

我已經用這種方法來處理,在過去的:

public ActionResult Something(string anything) 
{ 
    var anythings = anything.Split(new[] { '/' }, StringSplitOptions.RemoveEmptyEntries); 

而且這條路線:

"something/{*anything}" 

而且趕上了一切。這可能是一種氣味,但...

public class HomeController : Controller 
{ 
    public ActionResult Show(string anything) 
    { 
     Response.Write(anything); 
     return null; 
    } 

那麼默認的路由前...

routes.MapRoute("anything", "{*anything}", new {controller="Home",action="Show"}); 
+0

那麼根本,或不以「something」開頭的東西呢? –

+0

更新了我的答案 – mxmissile