ASP.NET MVC маршрутизация всеобъемлющее - PullRequest
1 голос
/ 28 августа 2009

Есть ли где-нибудь статья, объясняющая, как именно работает сопоставление маршрутов и на что он способен?

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

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

все они сопоставлены с одним и тем же действием контроллера, а URL-адрес передан в качестве параметра?

{*anything}

Вышеуказанное не работает. Разве он не может обрабатывать косые черты внутри аргументов?

Ответы [ 2 ]

3 голосов
/ 28 августа 2009

Код ниже ловит почти все.

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
1 голос
/ 28 августа 2009

Я должен был справиться с этим в прошлом, используя этот метод:

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"});
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...