204 votes

ASP.NET MVC4 WebAPI: paramètres facultatifs

J'ai besoin de mettre en place des WebAPI méthode:

/api/books?author=XXX&title=XXX&isbn=XXX&somethingelse=XXX&date=XXX

Tous les paramètres peuvent être nulles, c'est à dire l'appelant peut spécifier de 0 à tous les 5 paramètres.

Dans MVC4 bêta que j'ai utilisé pour effectuer les opérations suivantes:

public class BooksController : ApiController
{
    // GET /api/books?author=tolk&title=lord&isbn=91&somethingelse=ABC&date=1970-01-01
    public string GetFindBooks(string author, string title, string isbn, string somethingelse, DateTime? date) 
    {
        // ...
    }
}

MVC4 RC ne se comportent pas comme ça. Si je spécifie moins de 5 paramètres, il répond avec un 404 dire

No action was found on the controller 'Books' that matches the request.

Quelle est la bonne méthode de signature pour qu'elle se comporte comme elle était, sans avoir à spécifier le paramètre facultatif dans le routage d'URL?

300voto

frapontillo Points 2104

Ce problème a été résolu dans la version régulière de MVC4. Maintenant vous pouvez faire :

et tout fonctionne out of the box.

77voto

Andrew C Points 146

Il est possible de passer plusieurs paramètres, comme modèle unique, comme vijay suggéré. Cela fonctionne pour OBTENIR lorsque vous utilisez le FromUri attribut de paramètre. Cela dit WebAPI pour remplir le modèle de paramètres de requête.

Le résultat est un nettoyeur de contrôleur de l'action avec un seul paramètre. Pour plus d'informations, voir: http://www.asp.net/web-api/overview/formats-and-model-binding/parameter-binding-in-aspnet-web-api

public class BooksController : ApiController
  {
    // GET /api/books?author=tolk&title=lord&isbn=91&somethingelse=ABC&date=1970-01-01
    public string GetFindBooks([FromUri]BookQuery query)
    {
      // ...
    }
  }

  public class BookQuery
  {
    public string Author { get; set; }
    public string Title { get; set; }
    public string ISBN { get; set; }
    public string SomethingElse { get; set; }
    public DateTime? Date { get; set; }
  }

Il prend même en charge de plusieurs paramètres, tant que les propriétés n'entrent pas en conflit.

// GET /api/books?author=tolk&title=lord&isbn=91&somethingelse=ABC&date=1970-01-01
public string GetFindBooks([FromUri]BookQuery query, [FromUri]Paging paging)
{
  // ...
}

public class Paging
{
  public string Sort { get; set; }
  public int Skip { get; set; }
  public int Take { get; set; }
}

66voto

Muhammad Amin Points 213

Utilisez les valeurs initiales par défaut pour tous les paramètres comme ci-dessous

1voto

vijay Points 787

Si vous voulez passer plusieurs paramètres, alors vous pouvez créer modèle au lieu de passer plusieurs paramètres.

dans le cas où vous ne voulez pas passer n’importe quel paramètre ainsi, vous pouvez sauter dedans, puis votre code ressemblera soigné et propre.

1voto

Rizwan Mumtaz Points 775

Valeurs par défaut ne peuvent pas être fournies pour les paramètres qui ne sont pas déclarés ' `` '

Dans votre``

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X