的可變數量我創建了一個GET動作控制器的API:通查詢字符串參數爲單控制器動作
[Route("api/xxxxx/{param1:int}/{param1:int}")]
public IHttpActionResult Get(int param1, int param2) {
// method body...
}
的網址,將在以下格式:
/api/xxxxx/1/1?p1=5&p2=hello&p3=20161108
/api/xxxxx/1/1?p1=active
查詢字符串參數的數量和名稱將有所不同。
我想將查詢字符串參數傳遞給控制器方法,但由於名稱和數字不同,我無法將它們硬編碼到方法簽名中。有沒有辦法做到這一點?我嘗試過撥打var qsParams = ControllerContext.Request.GetQueryNameValuePairs();
,但在嘗試使用查詢字符串請求任何網址時,如果給出上述Route
屬性,則會收到資源未找到錯誤。
我已經想出了一個替代方案:使用路由值,而不是查詢字符串參數,然後使用捕獲所有{*tags}
,並把它作爲一個方法參數:
[Route("api/xxxxx/{param1:int}/{param1:int}/{*tags}")]
public IHttpActionResult Get(int param1, int param2, string tags) {
// method body...
}
隨着格式
網址/api/xxxxx/1/1/5/john/20161108
/api/xxxxx/1/1/active
這個工作,但我寧願使用查詢字符串,以便能夠使用命名的鍵,而不是依賴於參數的排序(也使用查詢字符串似乎更好的概念匹配,正在做)。
那麼,如何將變量查詢字符串參數傳遞給控制器操作?我說「傳遞」了參數,但它們不一定需要作爲方法參數傳遞,只要我可以從方法體中訪問查詢字符串參數,同時獲取帶有查詢字符串的URL以解析爲有問題的行動。
編輯:
值得一提的是,每一個可能的參數集創建多個操作方法是不是一種選擇。
編輯2:
我看到兩個直接的解決方案,如果他們能夠:
- 傳遞整個查詢字符串的操作方法作爲單個字符串 參數。然後我可以手動解析查詢字符串。
- 能夠在方法體內使用
ControllerContext.Request.GetQueryNameValuePairs()
,而不添加相應的參數到 方法簽名。
但是,我還沒有想出如果這兩件事情是可能的,但它似乎可能是一個或兩個都可能。
我沒有任何職位,只得到。此外,這似乎只是將問題轉移到實體。也就是說,現在框架將嘗試將參數映射到實體,但實體必須將參數定義爲屬性。因此,實體必須具有不同的名稱和數量的屬性才能映射到,這與以前相同,但現在嘗試在實體類中尋址。順便說一句,我沒有使用實體框架。 – neizan