Muszę zaimplementować następującą metodę WebAPI:
/api/books?author=XXX&title=XXX&isbn=XXX&somethingelse=XXX&date=XXX
Wszystkie parametry ciągu zapytania mogą mieć wartość NULL. Oznacza to, że dzwoniący może określić od 0 do wszystkich 5 parametrów.
W wersji beta MVC4 wykonałem następujące czynności:
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 już się tak nie zachowuje. Jeśli podam mniej niż 5 parametrów, odpowiada to 404
powiedzeniem:
Nie znaleziono działania na kontrolerze „Books”, które pasowałoby do żądania.
Jaki jest prawidłowy podpis metody, aby działał tak, jak kiedyś, bez konieczności podawania opcjonalnego parametru w routingu adresu URL?
c#
url
asp.net-web-api
query-string
frapontillo
źródło
źródło
Get
więc jest automatycznie związanyHTTP GET
metodą ...string?
nie jest prawidłowym typem. Nie można zadeklarowaćstring
jako typu zerowalnego, ponieważ jest to typ odwołania.Odpowiedzi:
Ten problem został rozwiązany w regularnej wersji MVC4. Teraz możesz zrobić:
i wszystko zadziała po wyjęciu z pudełka.
źródło
null
jest uważane za wyrażenie stałe i dlatego jest prawidłową wartością domyślną .Możliwe jest przekazanie wielu parametrów jako jednego modelu, jak sugeruje Vijay. Działa to dla GET, gdy używasz atrybutu parametru FromUri. Mówi to interfejsowi WebAPI o wypełnieniu modelu na podstawie parametrów zapytania.
Rezultatem jest czystsze działanie kontrolera z jednym parametrem. Aby uzyskać więcej informacji, zobacz: http://www.asp.net/web-api/overview/formats-and-model-binding/parameter-binding-in-aspnet-web-api
Obsługuje nawet wiele parametrów, o ile właściwości nie powodują konfliktu.
Aktualizacja :
Aby upewnić się, że wartości są opcjonalne, należy użyć typów referencyjnych lub wartości zerowych (np. Int?) Dla właściwości modeli.
źródło
int Skip
) i nie określono parametru zapytania dla tej właściwości, metoda kontrolera interfejsu API nadal pomyślnie dopasuje żądanie, a wartość dlaSkip
będzie tylko wartością domyślną dla tego typu, lub 0 w tym przypadkuUżyj początkowych wartości domyślnych dla wszystkich parametrów, takich jak poniżej
źródło
DateTime
nie ma wartości zerowej. Próbowałem już użyćDateTime?
zamiast tego, ale MVC nie mapuje żądania na podaną metodę, jeśli ustawię tylko niektóre parametry w moim żądaniu HTTP.DateTime
nie jest dopuszczalnym typem danych. Kod nie powinien się kompilować, ponieważ nie można przypisaćnull
wartości do parametru typuDateTime
. Być może powinieneś to zmienićDateTime?
lub użyć innej wartości jako domyślnej, takiej jakDateTime.Now
.Datetime.Now
nie można użyć przy domyślnej inicjalizacji parametru, mam poprawkę.jeśli chcesz przekazać wiele parametrów, możesz utworzyć model zamiast wielu parametrów.
w przypadku, gdy nie chcesz przekazać żadnego parametru, możesz w nim również pominąć, a kod będzie wyglądał schludnie i czysto.
źródło
Nie można podać wartości domyślnych dla parametrów, które nie zostały zadeklarowane '
optional
'W Twoim
WebApiConfig
źródło