12

Il controller ASP1 Web MVC4 API v1 è definito di seguito. Dovrebbe accettare 1 o 2 parametri di stringa di query.Come imporre all'API Web il riconoscimento del parametro querystring

Tuttavia, se il metodo viene chiamato, il parametro ko è sempre nullo. La richiesta è sotto Come risolvere in modo che il parametro klient o namepart possa essere passato nella stringa di query?

Web regolatore API v1:

namespace MyApp.Controllers 
{ 
    public class CustomersSearchViewModel 
    { 
     public string Klient { get; set; } 
     public string Namepart { get; set; } 
    } 


    [Authorize] 
    public class CustomersController : ApiController 
     { 

     public HttpResponseMessage Get(CustomersSearchViewModel ko) 
      { 
      // why ko is null ?   
      var res = GetCustomers(ko.Klient,ko.Namepart); 
      return Request.CreateResponse(HttpStatusCode.OK, 
        new { customers = res.ToArray() }); 
      } 

     } 
    } 

controller viene richiamato su richiesta (appl è in esecuzione dalla directory virtal ERP):

GET /erp/api/customers?namepart=kaks&_=1385320904347 HTTP/1.1 
Host: localhost:52216 
Connection: keep-alive 
Accept: application/json, text/javascript, */*; q=0.01 
X-Requested-With: XMLHttpRequest 
User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/31.0.1650.57 Safari/537.36 
Referer: http://localhost:52216/erp/Sale 
Accept-Encoding: gzip,deflate,sdch 
Accept-Language: et-EE,et;q=0.8,en-US;q=0.6,en;q=0.4 
Cookie: .myAuth=8B6B3CFFF3DF64EBEF3D258240D217C56603AF255C869FBB7934560D9F560659342DC4D1EAE6AB28454122A86C3CE6C598FB594E8DC84A; My_Session=5aw2bsjp4i4a5vxtekz 

di default di routing viene utilizzato:

config.Routes.MapHttpRoute(
     name: "DefaultApi", 
     routeTemplate: "api/{controller}/{id}", 
     defaults: new { id = RouteParameter.Optional } 
    ); 

L'applicazione deve essere eseguita per vincere il server Windows 2003, quindi non è possibile utilizzare Web API v.2.

Aggiornamento

ho provato anche

public HttpResponseMessage Get(string klient, string namepart) 

ma in questo caso viene restituito errore 404, l'azione non è stato trovato.

+0

Hai provato l'attributo '[FromUri]' sul parametro? –

risposta

19

tipi complessi sono prelevati dal corpo di una richiesta, ma è possibile modificare questo comportamento predefinito in questo modo:

public HttpResponseMessage Get([FromUri]CustomersSearchViewModel ko) 

tuo querystring deve contenere i parametri denominati come i vostri proprietà modello, altrimenti il ​​legame non funzionerà .

1

Un'altra opzione è implementare un provider di tipo personalizzato. Ciò consente il controllo sulla rappresentazione nella stringa di query e significa che non è necessario aggiungere l'attributo [FromUri] ai metodi di azione. Ciò ha senso se si ha un riutilizzo diffuso di un tipo di parametro complesso o se si ha bisogno di una rappresentazione personalizzata.

Un buon esempio di questo è dato in this blog post dove una posizione con latitudine e longitudine è implementata utilizzando entrambe le tecniche.

Problemi correlati