【问题标题】:How to pass routing parameter to controller constructor如何将路由参数传递给控制器​​构造函数
【发布时间】:2017-07-26 13:11:04
【问题描述】:

我有一个需要路由/结构清理的 Web API 4.6。让我们考虑以下路由配置:

public static void Register(HttpConfiguration config)
{
    config.Routes.MapHttpRoute(
            name: "BaseRoute",
            routeTemplate: "api/{source}/{sourceDocumentName}/{entity}/{projectNumber}/{action}/{outputType}"
        );
}

我希望{sourceDocumentName} 管理选定的控制器并将其传递给构造函数。因此,如果 {sourceDocumentName} == "Purchase" || "Order" 它将解析为 RequisitionController(sourceDocumentName) 并将参数传递给构造函数。

【问题讨论】:

  • 您需要这样做的实际要求是什么?它如何帮助您将路由值传递给控制器​​构造函数?
  • 使用“开箱即用”的 asp.net 意味着我必须使用相同的代码创建多个控制器。 PurchaseControllerOrderController 相同。

标签: c# asp.net asp.net-mvc asp.net-web-api routing


【解决方案1】:

真正要理解的是 Mvc 请求管道。当请求进来时,Route Table 即MvcRouteHandler 执行并获取MvcHttpHandler 的实例,该实例基本上在ControllerFactory 的帮助下根据路由数据初始化需要映射的控制器。

所以本质上,您正在查看的是拥有自己的 IControllerFactory 的自定义实现,以便能够利用此请求管道。

【讨论】:

  • 由于某种原因,我的自定义 IControllerFactory 在第一次请求后没有被调用,所以我无法让它工作。关于如何出去的例子不多,但here 就是其中之一。
【解决方案2】:

两件事:

  1. 为什么必须将它实际传递给构造函数?作为路由值,您已经可以随时通过以下方式访问它:RouteData.Values

  2. 如果大部分逻辑是共享的,您仍然可以使用多个控制器并让它们从基本控制器继承。

【讨论】:

  • 1.这解决了如何使用该路由值作为参数,而不是如何利用它映射到特定控制器。
  • 2.我现在实际上正在这样做。请注意,您必须制作自己的一行自定义路由提供程序,才能解析为派生类名称而不是基类名称。我对此不满意的原因是我遇到了在操作方法上覆盖路由的问题。
  • 你考虑过属性路由吗?可能会让你的生活更轻松。
  • 我在一个控制器中有属性路由(我知道,一团糟),在使用基于约定的路由时遇到问题(可能是由于自定义路由提供程序。删除基于约定的路由会使代码更“湿”,然后我想要并且难以维护。
  • 所以实际上这个答案可能会起作用,因此可以投票,但是@Jinish 的答案有更好的职责分离,所以目前正在测试这种方法。
猜你喜欢
  • 2016-08-22
  • 2014-11-04
  • 1970-01-01
  • 2016-05-16
  • 2017-01-12
  • 1970-01-01
  • 2015-08-18
  • 2020-04-03
  • 1970-01-01
相关资源
最近更新 更多