ASP.NET MVC路由全能

时间:2009-08-28 15:55:27

标签: asp.net-mvc routing

是否有文章在某处解释了路线匹配的确切工作方式以及它的功能?

例如,我如何编写一条路线来捕捉所有内容,以便:

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

所有映射到同一控制器操作,URL作为参数传递?

{*anything}

以上似乎不起作用。它可以不处理参数内的斜杠吗?

2 个答案:

答案 0 :(得分: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

答案 1 :(得分: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"});