2009-08-28 2 views
1

Есть ли какая-нибудь статья, где объясняется, как работает сопоставление маршрутов и на что оно способно?ASP.NET MVC routing catch-all

Например, как бы я пишу маршрут поймать все, так что:

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

Я делал это, но он не работал, теперь это: s wierd. должно быть, был одним из этих пятничных моментов! Спасибо за разъяснение –

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

как насчет корня, или вещей, которые не начинаются с «чего-то»? –

+0

обновил мой ответ – mxmissile