J'ai besoin d'implémenter la méthode WebAPI suivante:
/api/books?author=XXX&title=XXX&isbn=XXX&somethingelse=XXX&date=XXX
Tous les paramètres de chaîne de requête peuvent être nuls. Autrement dit, l'appelant peut spécifier de 0 à tous les 5 paramètres.
Dans MVC4 beta, j'avais l'habitude de faire ce qui suit:
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 comporte plus comme ça. Si je spécifie moins de 5 paramètres, il répond par un 404
dicton:
Aucune action n'a été trouvée sur les livres du contrôleur qui correspond à la demande.
Quelle est la signature de méthode correcte pour qu'elle se comporte comme avant, sans avoir à spécifier le paramètre facultatif dans le routage URL?
c#
url
asp.net-web-api
query-string
frapontillo
la source
la source
Get
donc il est automatiquement lié à laHTTP GET
méthode ...string?
n'est pas un type valide. Vous ne pouvez pas déclarer enstring
tant que type nullable car il s'agit d'un type de référence.Réponses:
Ce problème a été corrigé dans la version régulière de MVC4. Vous pouvez maintenant:
et tout fonctionnera hors de la boîte.
la source
null
est considéré comme une expression constante , et donc une valeur par défaut valide .Il est possible de passer plusieurs paramètres en un seul modèle comme l'a suggéré vijay. Cela fonctionne pour GET lorsque vous utilisez l'attribut de paramètre FromUri. Cela indique à WebAPI de remplir le modèle à partir des paramètres de 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
Il prend même en charge plusieurs paramètres, tant que les propriétés ne sont pas en conflit.
Mise à jour :
Afin de garantir que les valeurs sont facultatives, assurez-vous d'utiliser des types de référence ou des valeurs Nullables (ex. Int?) Pour les propriétés des modèles.
la source
int Skip
) et qu'aucun paramètre de requête n'est spécifié pour cette propriété, la méthode API Controller correspondra toujours avec succès à la demande et la valeur deSkip
sera juste la valeur par défaut pour ce type, ou 0 dans ce casUtiliser les valeurs par défaut initiales pour tous les paramètres comme ci-dessous
la source
DateTime
n'est pas annulable. J'ai déjà essayé d'utiliser à laDateTime?
place, mais MVC ne mappe pas la demande à la méthode donnée si je ne définis que certains des paramètres dans ma demande HTTP.DateTime
n'est pas un type de données nullable . Votre code ne doit pas être compilé, car vous ne pourriez pas attribuer denull
valeur à un paramètre de typeDateTime
. Peut-être devriez-vous le changerDateTime?
ou utiliser une valeur différente pour une valeur par défaut commeDateTime.Now
.Datetime.Now
ne peut pas être utilisé dans l'initialisation des paramètres par défaut, je suis corrigé.si vous voulez passer plusieurs paramètres, vous pouvez créer un modèle au lieu de passer plusieurs paramètres.
dans le cas où vous ne voulez pas passer de paramètre, vous pouvez également l'ignorer et votre code sera net et propre.
la source
Les valeurs par défaut ne peuvent pas être fournies pour les paramètres qui ne sont pas déclarés '
optional
'Dans votre
WebApiConfig
la source