Asp.net mvc 基于属性的路由和排序
我在.NET4.6.1上的ASP.NET4.5上使用ASP.NETMVC5 我有两个控制器: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
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个字符)。