基于属性的路由和顺序

Dai*_*Dai 6 asp.net-mvc asp.net-mvc-routing

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

我有两个控制器:

FooController
FooIndexController
Run Code Online (Sandbox Code Playgroud)

这是因为 的 Index 操作Foo很复杂,所以我觉得它们最好在自己的单独Controller类中。

我正在使用基于属性的路由。我的 ASP.NET MVC 版本OrderRouteAttribute.

我有这些动作:

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() {
        ...
    }
}
Run Code Online (Sandbox Code Playgroud)

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

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

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

为什么不考虑Order财产?

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

更新

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

更新2

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