Je dois implémenter la méthode WebAPI suivante:
/api/books?author=XXX&title=XXX&isbn=XXX&somethingelse=XXX&date=XXX
Tous les parameters peuvent être nuls, c’est-à-dire que l’appelant peut spécifier de 0 à tous les 5 parameters.
Dans MVC4 beta, je faisais les choses suivantes:
public class BooksController : ApiController { // GET /api/books?author=tolk&title=lord&isbn=91&somethingelse=ABC&date=1970-01-01 public ssortingng GetFindBooks(ssortingng author, ssortingng title, ssortingng isbn, ssortingng somethingelse, DateTime? date) { // ... } }
MVC4 RC ne se comporte plus comme ça. Si je spécifie moins de 5 parameters, il répond avec un 404
disant
Aucune action n’a été trouvée sur le contrôleur “Livres” correspondant à la demande.
Quelle est la signature de méthode correcte pour le faire se comporter comme avant, sans avoir à spécifier le paramètre facultatif dans le routage d’URL?
Ce problème a été corrigé dans la version régulière de MVC4. Maintenant vous pouvez faire:
public ssortingng GetFindBooks(ssortingng author="", ssortingng title="", ssortingng isbn="", ssortingng somethingelse="", DateTime? date= null) { // ... }
et tout fonctionnera hors de la boîte.
Il est possible de transmettre plusieurs parameters en un seul modèle, comme le suggère vijay. Cela fonctionne pour GET lorsque vous utilisez l’atsortingbut de paramètre FromUri. Cela indique à WebAPI de remplir le modèle à partir des parameters de la requête.
Le résultat est une action de contrôleur plus propre 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 ssortingng GetFindBooks([FromUri]BookQuery query) { // ... } } public class BookQuery { public ssortingng Author { get; set; } public ssortingng Title { get; set; } public ssortingng ISBN { get; set; } public ssortingng SomethingElse { get; set; } public DateTime? Date { get; set; } }
Il prend même en charge plusieurs parameters, tant que les propriétés ne sont pas en conflit.
// GET /api/books?author=tolk&title=lord&isbn=91&somethingelse=ABC&date=1970-01-01 public ssortingng GetFindBooks([FromUri]BookQuery query, [FromUri]Paging paging) { // ... } public class Paging { public ssortingng Sort { get; set; } public int Skip { get; set; } public int Take { get; set; } }
Mise à jour :
Pour vous assurer que les valeurs sont facultatives, veillez à utiliser des types de référence ou des valeurs nullables (ex. Int?) Pour les propriétés des modèles.
Utilisez les valeurs initiales par défaut pour tous les parameters comme ci-dessous
public ssortingng GetFindBooks(ssortingng author="", ssortingng title="", ssortingng isbn="", ssortingng somethingelse="", DateTime? date= null) { // ... }
Si vous souhaitez transmettre plusieurs parameters, vous pouvez créer un modèle au lieu de transmettre plusieurs parameters.
au cas où vous ne voudriez pas passer de paramètre, vous pouvez aussi y sauter, et votre code sera propre et net.
Les valeurs par défaut ne peuvent pas être fournies pour les parameters qui ne sont pas déclarés ” optional
”
Function GetFindBooks(id As Integer, ByVal pid As Integer, Optional sort As Ssortingng = "DESC", Optional limit As Integer = 99)
Dans votre WebApiConfig
config.Routes.MapHttpRoute( _ name:="books", _ routeTemplate:="api/{controller}/{action}/{id}/{pid}/{sort}/{limit}", _ defaults:=New With {.id = RouteParameter.Optional, .pid = RouteParameter.Optional, .sort = UrlParameter.Optional, .limit = UrlParameter.Optional} _ )