2016-07-07 38 views
7

Ho un controller con la seguente firma:Web API parametri opzionali

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

Io chiamo questo metodo con i seguenti URI:?

  • ~/api/prodotti/filtro APC = AA & XPC = BB
  • ~/api/prodotti/filtro? sku = 7199123

La prima URI funziona senza alcun problema. Il secondo ha uno strano effetto collaterale. Anche se i valori predefiniti per apc e xpc dovrebbero essere nulli se non forniti, i parametri sono in realtà i loro nomi. Posso superare questo con l'aggiunta della logica aggiuntiva:

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

Questo mi sembra un hack, e sarebbe problematico se il valore passato è stato sempre uguale al nome del parametro.

C'è un modo per definire il percorso senza questo effetto collaterale?

+1

Hai fornito valori predefiniti nel modello di percorso. Perché dovresti aspettarti che siano "nulli"? –

+0

Ho pensato {sku = sku} mappato il parametro nella stringa di query al parametro method. – Josh

+0

È necessario rivedere la [documentazione per il routing degli attributi] (http://www.asp.net/web-api/overview/web-api-routing-and-actions/attribute-routing-in-web-api-2# opzionale). Mostra come rendere i parametri opzionali. –

risposta

19

L'ho capito. Stavo usando un cattivo esempio che ho trovato nel passato su come mappare la stringa di query sui parametri del metodo.

Nel caso qualcuno altro ha bisogno, per avere parametri facoltativi in ​​una stringa di query quali:?

  • ~/api/prodotti/filtro APC = AA & xpc = BB
  • ~/? api/prodotti/filtro sku = 7199123

si userebbe:

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

Sembra dispari da definire valori predefiniti per i parametri del metodo quando questi tipi hanno già un valore predefinito.

+0

I echo your thoughts - 'Sembra strano dover definire i valori predefiniti per i parametri del metodo quando questi tipi hanno già un valore predefinito. Controllato i dettagli su MSDN als [qui] (https://www.asp.net/web-api/overview/web-api-routing-and-actions/attribute-routing-in-web-api-2#optional) ma non parla di dettagli tecnici sul motivo per cui è stato deciso di essere così. – RBT

+4

Nullability e opzionalità sono due concetti diversi e non hanno nulla a che fare l'uno con l'altro (poiché i valori nullable possono essere utilizzati al di fuori di un elenco di parametri). Dichiarare semplicemente un parametro 'int?' Lo contrassegna come * nullable *, ma non è * opzionale *: è necessario passare un valore integrale non nullo o 'null'. L'aggiunta di '= null', tuttavia, è la sintassi richiesta per la dichiarazione del valore predefinito di un parametro facoltativo. Quindi, int? sku = null' è un valore nulla 'int' il cui valore predefinito è' null' (invece di qualche altro valore integrale). –