2015-06-20 5 views
9

Sto creando un web API utilizzando mvc 6. ora sto cercando di ottenere un elemento dal mio db. la chiave in questa tabella è una stringa (indirizzo email). Non ho accesso a questo database, quindi non posso cambiare la chiave di questo tavolo.Ottieni elemento in base alla stringa

Ora durante la creazione di una demo webapi sono riuscito a creare un controller per estrarre gli elementi in base a una chiave che era un int. Ma quando si tenta di ottenere un elemento con una stringa, il programma si blocca.

[Route("api/[controller]")] 
    public class TodoController : Controller 
    {  

     [HttpGet("{id:string}", Name = "GetByIdRoute")] 
     public IActionResult GetById (string id) 
     { 
      var item = _items.FirstOrDefault(x => x.Id == id); 
      if (item == null) 
      { 
       return HttpNotFound(); 
      } 

      return new ObjectResult(item); 
     } 
    } 

quando si cerca di accedere a questo percorso della chiave (example.com/api/Todo/key) essendo la stringa ottengo un'eccezione nei miei startup.cs

l'eccezione nel browser legge:

System.InvalidOperationException il vincolo di ingresso 'id' - 'stringa' sulla rotta 'api/Todo/{id: string}' non poteva essere risolto dal resolver vincolo di tipo 'DefaultInlineConstraintResolver'.

parte dei startup.cs in cui il codice interruzioni è:

// Add MVC to the request pipeline. 
      app.UseMvc(routes => 
      { 
       routes.MapRoute(
        name: "default", 
        template: "{controller}/{action}/{id?}", 
        defaults: new { controller = "Home", action = "Index" }); 

      }); 

i cant sembrano di capire il motivo per cui non è permesso di ottenere un elemento da una chiave che è una stringa. questo è anche possibile e se sì cosa sto facendo di sbagliato?

+2

Avete assolutamente bisogno della parte ': string'? –

+1

È possibile rimuovere ': string' per impostazione predefinita. – adricadar

+0

thx ha fatto il lavoro (; –

risposta

29

Basta rimuovere :string. In realtà non stai limitando il valore di id: è già una stringa nell'URL.

This fairly old blog post elenca i vincoli disponibili - e puoi vedere che non c'è un vincolo :string, perché non è necessario esserci.

I vincoli vengono utilizzati per assegnare priorità "più specifiche", ad es. "Se quella parte dell'URL è la rappresentazione in stringa di un DateTime, usa questa route" - ma poiché tutto è una stringa (in un URL), non c'è nulla che un vincolo di :string renderebbe più specifico di, se vedi cosa Intendo.

+2

Questo vale anche per Razor Pages in .NET Core 2.0, immagino che sia lo stesso processo di mettere insieme tutti i pezzi. –