我有一个自定义的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分别作为控制器和动作的值。
发布于 2018-08-09 17:35:12
这是设计好的。
操作要么按常规路由,要么按属性路由。将路由放在控制器或操作上会使其属性路由。定义属性路由的操作不能通过传统路由到达,反之亦然。控制器上的任何路由属性都会路由控制器属性中的所有操作。
参考:Mixed routing: Attribute routing vs conventional routing。
对于Conventional router,它使用MvcRouteHandler,而Attribute route将使用MvcAttributeRouteHandler。当Controller或Action与Route[]一起使用时,当您请求具体方法时,它不会转到Converntional router。
https://stackoverflow.com/questions/51740729
复制相似问题