2017-03-06 102 views
0

我有一个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)并将该参数传递给构造函数。

+0

您需要这样做的实际要求是什么?它如何帮助您将路由值传递给控制器​​构造函数? –

+0

使用asp.net“开箱即用”,这意味着我将不得不使用相同的代码创建多个控制器。 'PurchaseController'与'OrderController'相同。 – Thor

回答

1

两件事情:

  1. 为什么它要真正传递到构造函数?作为路由值,您可以随时通过以下方式访问它:RouteData.Values

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

+0

1.解决了如何使用该路由值作为参数,而不是如何利用它来映射到特定的控制器。 – Thor

+0

2.我现在正在做这件事。请注意,您必须创建自己的一行自定义路由提供程序才能解析为派生类名称,而不是基类名称。我对此不满意的原因是因为我遇到了在操作方法上覆盖路线的问题。 – Thor

+1

你考虑过属性路由吗?可能会让你的生活更轻松。 –

2

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

所以基本上你在看什么是有自己的自定义实现IControllerFactory所以能够进入这个请求管道。

+0

出于某种原因,我的自定义IControllerFactory没有被第一次请求后被调用,所以我无法得到它的工作。关于如何在那里的例子并不多,但[这里](http://www.jomendez.com/2016/01/20/how-to-create-custom-controller-factory-asp-net/)就是其中之一。 – Thor

相关问题