2016-07-07 63 views
7

我有以下簽名控制器:的Web API可選參數

[Route("products/filter/{apc=apc}/{xpc=xpc}/{sku=sku}")] 
public IHttpActionResult Get(string apc, string xpc, int? sku) 
{ ... } 

我把這種方法用下面的URI:

  • 〜/ API /產品/過濾APC = AA & XPC = BB
  • 〜/ API /產品/過濾器?SKU = 7199123

的第一個URI工作沒有問題。第二個有一個奇怪的副作用。儘管apc和xpc的默認值在未提供時應爲null,但參數實際上是它們的名稱。我可以通過添加額外的邏輯解決這個問題:

apc = (apc == "apc") ? null : apc; 
xpc = (xpc == "xpc") ? null : xpc; 

這似乎是一個黑客,並會產生問題,如果傳遞的值是有史以來等於參數名稱。

有沒有辦法定義沒有這種副作用的路線?

+1

您在路線模板中提供了默認值。你爲什麼期望他們是'空'? –

+0

我認爲{sku = sku}將查詢字符串中的參數映射到方法參數。 – Josh

+0

您應該查看[屬性路由的文檔](http://www.asp.net/web-api/overview/web-api-routing-and-actions/attribute-routing-in-web-api-2#可選的)。它顯示瞭如何使參數可選。 –

回答

19

我想通了。我在過去發現了一個不好的例子,那就是如何將查詢字符串映射到方法參數。

如果任何人需要它,才能在查詢字符串可選參數,如:

  • 〜/ API /產品/過濾APC = AA & XPC = BB
  • 〜/ ?API /產品/過濾SKU = 7199123

你可以使用:

[Route("products/filter/{apc?}/{xpc?}/{sku?}")] 
public IHttpActionResult Get(string apc = null, string xpc = null, int? sku = null) 
{ ... } 

似乎奇怪的是,當這些類型已經具有默認值時,必須爲方法參數定義默認值。

+0

我回應你的想法 - 「當這些類型已經有了默認值時,必須爲方法參數定義默認值似乎很奇怪。查看MSDN上的詳細信息[此處](https://www.asp.net/web-api/overview/web-api-routing-and-actions/attribute-routing-in-web-api-2#optional)但它並沒有談論任何技術細節,爲什麼它被認爲是這樣的。 – RBT

+4

可空性和可選性是兩個不同的概念,它們與另一個無關(因爲可以在參數列表之外使用可空值)。簡單地聲明一個參數'int?'標記爲* nullable *,但它不是*可選的*:您必須傳遞一個非空整數值或null。但是,添加'= null'是聲明可選參數的默認值所需的語法。因此,'int? sku = null'是一個可爲空的'int',其默認值爲'null'(而不是其他一些整數值)。 –