2017-03-06 60 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

相關問題