2012-03-30 18 views
7

Let dire che ho due metodi in MVC Controller API 4 Web:parametri URL in MVC 4 Web API

public IQueryable<A> Get() {} 

E

public A Get(int id) {} 

E il seguente itinerario:

routes.MapHttpRoute(
    name: "Default", 
    routeTemplate: "{controller}/{id}", 
    defaults: new { id = RouteParameter.Optional } 
); 

Funziona come previsto. L'aggiunta di una più parametri, ad esempio:

public IQueryable<A> Get(int p) {} 

public A Get(int id, int p) {} 

porta ad una situazione in cui MVC ritorna 404 per la seguente richiesta:

GET /controller?p=100 

O

GET /controller/1?p=100 

con il messaggio "è stato trovato Nessuna azione sul controller 'controller' che corrisponde alla richiesta "

Mi aspetto che URL parame ters dovrebbe essere cablato da MVC senza problemi, ma non è vero. Si tratta di un bug o di una mia incomprensione su come le mappe MVC richiedono all'azione?

+0

[qui] (http: // forum. asp.net/t/1774984.aspx/2/10) lo stesso problema è descritto ma senza alcuna conclusione è previsto questo comportamento –

+0

PS. a causa dello stesso problema, la sintassi OData nell'URL non funzionerà se ci sono più di un metodo associato al verbo HTTP. –

+0

Puoi mostrare il tuo percorso reale e tutti i metodi e le firme nel tuo controller? –

risposta

8

Se pensi a cosa stai tentando di fare e ai percorsi che stai cercando, ti renderai conto che il secondo parametro "p" nel tuo caso, deve essere contrassegnato come parametro opzionale.

che è il percorso deve essere definito in questo modo:

routes.MapHttpRoute(
name: "Default", 
routeTemplate: "{controller}/{id}/{p}", 
defaults: new { id = RouteParameter.Optional, p = RouteParameter.Optional }); 

Una volta fatto questo, l'URL

/regolatore p = 100 vengono mappati sul

public IQueryable<A> Get(int p) {} 

? metodo e un URL come questo:

/controller/1?p=100 

mapperà al metodo

public A Get(int id, int p) {} 

, come previsto.

Quindi per rispondere alle vostre domande .... no questo non è un bug ma come progettato/previsto.

+0

Questo è OK, ma per quanto ricordo quando un po 'di tempo fa usava MVC 2, il modo comune è solo quello di specificare i parametri del metodo, senza toccare la rotta. Esempio: [qui] (http://stackoverflow.com/questions/627838/asp-net-mvc-getting-querystring-values) - e MVC dovrebbe eseguire il lavoro per il cablaggio. Query parte dell'URL per inserire i parametri. –

+0

@pborovik, come ho detto prima, "se ci pensi", ti renderai conto che devi specificare che anche il secondo parametro è opzionale. Non si può dire che il primo parametro sia opzionale ma il secondo no. Semplicemente non ha senso. –

+0

@pborovik se hai definito "overload" per questi metodi, il controller API invierà tali metodi nel caso in cui non venga fornito il secondo parametro. Ma nel tuo caso hai solo i due metodi, quindi il dispatcher non può inviare alcun metodo di azione. –

0

Nel WebApiConfig aggiungere nuovi valori di default per il httproute

RouteParameter.Optional per le rotte aggiuntive non ha funzionato per me

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