Je veux gérer le POST de l'appel API suivant:
/v1/location/deviceid/appid
Des paramètres supplémentaires proviennent du post-corps.
Tout cela fonctionne bien pour moi. Maintenant, je veux étendre mon code en autorisant "deviceid" et / ou "appid" et / ou BodyData à être null:
/v1/location/deviceid
/v1/location/appid
/v1/location/
Ces 3 URL doivent répondre par la même route.
Ma première approche (BodyData requis):
[Route("v1/location/{deviceid}/{appid}", Name = "AddNewLocation")]
public location_fromuser Post(string deviceid = null, string appid = null, [FromBody] location_fromuser BodyData)
{
return repository.AddNewLocation(deviceid, appid, BodyData);
}
Cela ne fonctionne pas et renvoie une erreur de compilation:
"Les paramètres facultatifs doivent être à la fin"
Prochain essai:
[Route("v1/location/{deviceid}/{appid}", Name = "AddNewLocation")]
public location_fromuser Post([FromBody] location_fromuser BodyData, string deviceid = null, string appid = null)
Maintenant, ma fonction AddNewLocation () obtient toujours un BodyData=null
- même si l'appel envoie le Body.
Enfin, j'ai mis les 3 paramètres en option:
[Route("v1/location/{deviceid}/{appid}", Name = "AddNewLocation")]
public location_fromuser Post(string deviceid = null, string appid = null, [FromBody location_fromuser BodyData = null)
Ne fonctionne pas:
Le paramètre facultatif
BodyData
n'est pas pris en charge parFormatterParameterBinding
.
Pourquoi est-ce que je veux une solution avec des paramètres facultatifs? Mon contrôleur ne gère que "l'ajout d'un nouvel emplacement" via un POST.
Je veux envoyer sur de mauvaises données mes propres exceptions ou messages d'erreur. Même si l'appel a des valeurs manquantes. Dans ce cas, je veux pouvoir décider de lever une exception ou de définir les valeurs par défaut par mon code.
la source
?
à l'intérieur du modèle d'itinéraire est ce que je recherchais. +1?
caractère, nous devons fournir des valeurs par défaut aux paramètres dans la signature de la méthode, par exemple MyMethod (string name = "someDefaultValue", int? Id = null).Une autre information: si vous voulez utiliser une contrainte de route , imaginez que vous voulez forcer ce paramètre à un type de données int , alors vous devez utiliser cette syntaxe:
Le ? le caractère est toujours placé avant le dernier caractère }
Pour plus d'informations, voir: Paramètres d'URI facultatifs et valeurs par défaut
la source
Convertir mon commentaire en réponse pour compléter la réponse de @Kiran Chala car cela semble utile pour le public-
Lorsque nous marquons un paramètre comme facultatif dans l'URI d'action à l'aide de
?
character, nous devons fournir des valeurs par défaut aux paramètres de la signature de la méthode, comme indiqué ci-dessous:MyMethod(string name = "someDefaultValue", int? Id = null)
la source