获取具有RouteAttribute的操作的RouteData

时间:2018-08-08 07:19:38

标签: c# asp.net-core asp.net-core-mvc url-routing asp.net-core-routing

我有一个自定义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值,我仍然分别将值HomeIndex分别用作控制器和操作的值。

1 个答案:

答案 0 :(得分:1)

这是设计使然。

  

按常规路线或属性路线进行操作。在控制器或操作上放置路由会使其路由属性。定义属性路由的操作无法通过常规路由来实现,反之亦然。控制器上的任何route属性都会路由控制器属性中的所有操作。

参考:Mixed routing: Attribute routing vs conventional routing

对于Conventional router,它正在使用MvcRouteHandler,而Attribute route将使用MvcAttributeRouteHandler。当ControllerActionRoute[]一起使用时,当您请求特定方法时,它将不会转到Converntional router