Chcę obsłużyć POST następującego wywołania API:
/v1/location/deviceid/appid
Dodatkowe parametry pochodzą z post-body.
To wszystko działa dobrze dla mnie. Teraz chcę rozszerzyć mój kod, zezwalając „deviceid” i / lub „appid” i / lub BodyData na null:
/v1/location/deviceid
/v1/location/appid
/v1/location/
Te 3 adresy URL powinny odpowiadać tą samą drogą.
Moje pierwsze podejście (wymagane BodyData):
[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);
}
To nie działa i zwraca błąd kompilacji:
„Opcjonalne parametry muszą znajdować się na końcu”
Następna próba:
[Route("v1/location/{deviceid}/{appid}", Name = "AddNewLocation")]
public location_fromuser Post([FromBody] location_fromuser BodyData, string deviceid = null, string appid = null)
Teraz moja funkcja AddNewLocation () otrzymuje zawsze BodyData=null
- nawet jeśli wywołanie wysyła Body.
Na koniec ustawiłem wszystkie 3 parametry jako opcjonalne:
[Route("v1/location/{deviceid}/{appid}", Name = "AddNewLocation")]
public location_fromuser Post(string deviceid = null, string appid = null, [FromBody location_fromuser BodyData = null)
Nie działa:
Opcjonalny parametr
BodyData
nie jest obsługiwany przezFormatterParameterBinding
.
Dlaczego chcę rozwiązania z opcjonalnymi parametrami? Mój kontroler obsługuje tylko „dodawanie nowej lokalizacji” przez POST.
Chcę wysyłać własne wyjątki lub komunikaty o błędach w przypadku złych danych. Nawet jeśli w wywołaniu brakuje wartości. W takim przypadku chcę móc zdecydować o rzuceniu wyjątku lub ustawieniu wartości domyślnych przez mój kod.
źródło
?
wewnątrz szablonu trasy jest to, czego szukałem. +1?
znaku, to musimy podać domyślne wartości parametrów w sygnaturze metody, np. MyMethod (string name = "someDefaultValue", int? Id = null).Inna informacja: jeśli chcesz użyć ograniczenia trasy , wyobraź sobie, że chcesz, aby parametr miał typ danych int , a następnie użyj tej składni:
[Route("v1/location/**{deviceOrAppid:int?}**", Name = "AddNewLocation")]
The ? znak jest umieszczany zawsze przed ostatnim } znakiem
Aby uzyskać więcej informacji, zobacz: Opcjonalne parametry URI i wartości domyślne
źródło
Przekształcenie mojego komentarza w odpowiedź uzupełniającą odpowiedź @Kiran Chala, która wydaje się pomocna dla publiczności:
Kiedy oznaczymy parametr jako opcjonalny w uri akcji za pomocą
?
znaku, musimy podać domyślne wartości parametrów w sygnaturze metody, jak pokazano poniżej:MyMethod(string name = "someDefaultValue", int? Id = null)
źródło