【问题标题】:Getting RouteData for actions with RouteAttribute使用 RouteAttribute 获取操作的 RouteData
【发布时间】:2018-08-08 07:19:38
【问题描述】:

我有一个自定义 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 分别视为控制器和操作的值。

【问题讨论】:

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


    【解决方案1】:

    这是设计使然。

    动作要么是传统路由,要么是属性路由。在控制器或操作上放置路由使其属性路由。定义属性路由的动作不能通过常规路由到达,反之亦然。控制器上的任何路由属性都会使控制器属性中的所有动作都被路由。

    参考:Mixed routing: Attribute routing vs conventional routing

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

    【讨论】:

    • 感谢您的回复。是的,我读过它是设计使然。但是必须有某种方法可以使这项工作?我的意思是,我仍然可以将一些东西传递给 RouteData 来完成这项工作吗?必须有某种方法可以让自定义 IRouter 与属性路由一起使用!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-07-13
    • 1970-01-01
    • 2011-04-02
    • 2016-11-25
    • 2016-06-16
    • 2019-04-01
    相关资源
    最近更新 更多