我可以有两条彼此互补的路线吗?

时间:2015-02-18 06:42:31

标签: asp.net asp.net-mvc asp.net-mvc-routing

我可以定义这两条路线吗?我试过这个例子,但得到了404。

routes.MapRoute(
    name: "Default",
    url: "{controller}/{action}/{id}",
    defaults: new
    {
        controller = "Home",
        action = "Index",
        id = UrlParameter.Optional
    }
);

routes.MapRoute(
    name: "ActionFirst",
    url: "{action}/{controller}/{id}",
    defaults: new { controller = "Home", 
        action = "Index", id = UrlParameter.Optional }
);

以下控制器和操作:

public class HomeController : Controller
{
    public ActionResult Index()
    {
        return Content("Hello, World!");
    }

    public ActionResult Foo()
    {
        return Content("I am the Foo action on the Home controller");
    }
}

以下符合默认路线的网址:

http://localhost:xxxx/
http://localhost:xxxx/Home
http://localhost:xxxx/Home/Foo

但符合 ActionFirst 路线名称的那些,如下所列,不会:

http://localhost:xxxx/Foo
http://localhost:xxxx/Foo/Home

我希望ASP.NET路由引擎会针对所有路由尝试Url,如果路由对其中一个路由失败。

因此,如果url未能匹配第一个路由名称,它会尝试将其与第二个路由名称匹配。但事实并非如此。

当然,如果我删除了默认路由并且只有 ActionFirst 路由,那么第二批Urls就可以了。

1 个答案:

答案 0 :(得分:0)

简答:

稍微简短的回答:它不会尝试一条路线,然后是下一条路线,它只是从上到下找到第一条匹配的路线。在您的示例中,首先定义的路线将获胜。

可以做什么(也许你想要的是什么?)[未经测试]

routes.MapRoute(
    name: "HomeActions",
    url: "{action}/{id}",
    defaults: new { 
        controller = "Home", 
        action = "Index", 
        id = UrlParameter.Optional 
    },
    constraints: new { id = @"\d+" }
);

routes.MapRoute(
    name: "Default",
    url: "{controller}/{action}/{id}",
    defaults: new {
        id = UrlParameter.Optional
    }
);

现在,您将以下路由到HomeController

http://yoursite.com/
http://yoursite.com/Foo
http://yoursite.com/Foo/123

以下路由到OtherController

http://yoursite.com/Other/Foo
http://yoursite.com/Other/Foo/123