Asp.net mvc 基于属性的路由和排序

Asp.net mvc 基于属性的路由和排序,asp.net-mvc,asp.net-mvc-routing,Asp.net Mvc,Asp.net Mvc Routing,我在.NET4.6.1上的ASP.NET4.5上使用ASP.NETMVC5 我有两个控制器: FooController FooIndexController 这是因为Foo的索引操作非常复杂,所以我觉得最好将它们放在各自独立的Controller类中 我正在使用基于属性的路由。我的ASP.NET MVC版本在RouteAttribute上具有Order属性 我有以下行动: class FooController { // Returns a view to allow editin

我在.NET4.6.1上的ASP.NET4.5上使用ASP.NETMVC5

我有两个控制器:

FooController
FooIndexController
这是因为
Foo
的索引操作非常复杂,所以我觉得最好将它们放在各自独立的
Controller
类中

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

我有以下行动:

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
将匹配两个路由模板,但我为
IndexCsv
操作指定了一个显式的
Order=1
,因此它应该匹配该操作的路由并使用它来完成,但是我仍然得到了这个死亡的黄色屏幕:

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

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

为什么它忽略了
Order
属性

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

更新

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

更新2


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

有趣。如果将它们放在同一个控制器中,则可以正常工作,并且会命中
IndexCsv()
方法(假设您将其设置为
[HttpGet]
)@StephenMuecke:
RouteAttribute
顺序优先级使用具有不同相对路径的相同操作方法名称工作。但是如果操作方法名称不同,则应使用路由约束,例如,
[route(“~/{tenant}/foo/{fooName:string}”,Order=2)]
@tetsuyayayayamamoto,该约束似乎没有必要。如果
顺序
值在同一个控制器中,则使用不同的操作名称正确地遵循它们,但是当在不同的控制器中时,使用与OP完全相同的方法抛出错误indicated@StephenMuecke如果我尝试对
Edit
(因为
fooName
将始终超过3个字符)。