我有一个自定义IRouter实现,它的基本形式如下所示,为简单起见,我对一些值进行了硬编码:
public class MyRouter : IRouter
{
private readonly IRouter router;
public MyRouter (IRouter router)
{
this.router = router;
}
public async Task RouteAsync(RouteContext context)
{
context.RouteData.Values["controller"] = "Home";
context.RouteData.Values["action"] = "Index";
context.RouteData.Values["area"] = "";
await router.RouteAsync(context);
}
}
这适用于没有定义[Route]
属性的简单控制器:
public class HomeControlller
{
public IActionResult Index()
{
return View();
}
}
同样,这可以正常工作。转到/
将显示该页面。
但是,一旦添加[Route]
属性,我就会得到一个404:
[Route("foo")]
public class HomeControlller
{
[Route("bar")]
public IActionResult Index()
{
return View();
}
}
现在,如果我转到/foo/bar
,将看到该页面。但是,如果我转到/
,则会收到404。
我怎样才能解决这个问题?如果在转到/foo/bar
时查看RouteData值,我仍然分别将值Home
和Index
分别用作控制器和操作的值。
答案 0 :(得分:1)
这是设计使然。
按常规路线或属性路线进行操作。在控制器或操作上放置路由会使其路由属性。定义属性路由的操作无法通过常规路由来实现,反之亦然。控制器上的任何route属性都会路由控制器属性中的所有操作。
参考:Mixed routing: Attribute routing vs conventional routing。
对于Conventional router
,它正在使用MvcRouteHandler
,而Attribute route
将使用MvcAttributeRouteHandler
。当Controller
或Action
与Route[]
一起使用时,当您请求特定方法时,它将不会转到Converntional router
。