基于属性的路由和订单

时间:2016-11-17 10:57:09

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

我在ASP.NET 4.6.1上的ASP.NET 4.5上使用ASP.NET MVC 5.

我有两个控制器:

FooController
FooIndexController

这是因为Foo的索引操作很复杂,所以我觉得它们更适合自己独立的Controller类。

我使用基于属性的路由。我的ASP.NET MVC版本在Order上有RouteAttribute属性。

我有这些行动:

class FooController {

    // Returns a view to allow editing of the Foo entity
    [HttpGet]
    [Route("~/{tenant}/foo/{fooName}", Order=2)]
    public ActionResult Edit(String fooName, FooViewModel model) {
        ...
    }

}

class FooIndexController {

    // Returns a CSV file download listing all of the Foo entities
    [HttpPost]
    [Route("~/{tenant}/foo/csv", Order=1)]
    public ActionResult IndexCsv() {
        ...
    }
}

因此,虽然资源路径bar/foo/csv将匹配两个路径模板,但我已为Order=1操作指定了显式IndexCsv,因此它应与该操作的路由匹配,并且完成它,但我仍然得到这个黄色的死亡屏幕:

  

找到了与URL匹配的多种控制器类型。如果多个控制器上的属性路由与请求的URL匹配,则会发生这种情况。

     

请求已找到以下匹配的控制器类型:       MyProject.FooController       MyProject.FooIndexController

为什么忽视Order属性?

我没有在控制器上使用[RoutePrefix]或任何其他属性。

更新

我使用Phil Haack的路由调试器运行,奇怪的是它说POST bar/foo/csv除了n/a{*catchall}之外没有匹配任何路由而GET bar/foo/123没有& #39; t匹配Edit的路由(尽管调用了操作) - 我想知道这个次要问题是否是路由调试器中的错误。

UPDATE2

我也没有使用基于全局/会议的路由。它是100%基于属性的路由。

0 个答案:

没有答案