2012-12-15 2 views
7

Ho un controller Web API (TasksController) con un metodo get come:Parametro opzionale WebApi - è richiesto?

public IEnumerable<TimeUnitModel> Get(DateTime startDate, DateTime endDate, string projectCode = "") 

Se chiamo

/api/tasks?startDate=2012%2F12%2F08&endDate=2012%2F12%2F15 

il risultato corretto viene restituito.

Se chiamo

/api/tasks?startDate=2012%2F12%2F08&endDate=2012%2F12%2F15&projectCode= 

tanto sono:

{"projectCode.String":"A value is required but was not present in the request."} 

Qualsiasi idea del perché questo accade? Grazie.

Edit: Ecco quello che ho nel config percorso:

config.Routes.MapHttpRoute(
      name: "tasks_get", 
      routeTemplate: "api/tasks", 
      defaults: new { controller = "tasks", projectCode = RouteParameter.Optional} 
     ); 
+0

Hai impostato UrlParameter.Optional in RouteConfig per il parametro projectCode? – dinukadev

+0

Ho provato questo e non riesco a vedere quello che vedi. Ho persino rimosso il default dall'azione e tutto non ha alcun problema. – Aliostad

+1

@sirrocco Ho visto un comportamento simile a questo prima, su questa domanda http://stackoverflow.com/questions/12006524/why-does-modelstate-isvalid-fail-for-my-apicontroller-method-that-has-nullable -p/12622152 # 12622152 –

risposta

2

La prima chiamata: /api/tasks?startDate=2012%2F12%2F08&endDate=2012%2F12%2F15 è come si chiama il metodo con un parametro opzionale (cioè il parametro è opzionale , quindi non lo stai specificando). Quando si specifica "& projectCode =" nella stringa di query, si è specificando il parametro e lo si specifica come null. Poiché le stringhe sono annullabili, l'API presuppone che desideri per inviare un valore null. Se si desidera che il metodo venga eseguito con una stringa vuota, basta chiamarlo come prima senza inserire quel parametro.