2013-08-07 12 views
5

Chcę utworzyć usługa REST przy użyciu asp.net WebAPI na .net 4.5ASP.net WebAPI Parametr Wiązanie typu złożonego z URI

Urls powinien być takim formacie jak poniżej:

/values?Age=55&Height=176&Race=1&Weight=80&Gender=male&id=800001 

Powiązany kontroler wygląda następująco:

[HttpGet] 
public string Get(int id, [FromUri]Demographics demographics) 
{ // etc.} 

Gdzie demografia jest obiektem niestandardowym, który jest w zasadzie tylko DTO o określonych właściwościach. Jednakże zawiera jedną właściwość, która ma typ niestandardowy ENUM:

enum Gender 
{ 
Female = 0, 
Male 
} 

Domyślne odwzorowanie działa dobrze, jeśli adres URL jest z powyższym formacie. Muszę jednak oczywiście sprawdzić, czy parametry podane przez adres URL są poprawne.

ASP.net WebApi (afaik) domyślnie próbuje zmapować każdy parametr na podstawie przyjętego typu (lub jeśli można go przekonwertować na ten typ). Jeśli nie może znaleźć pasującej wartości w identyfikatorze URI, wydaje się, że jest to tylko 0.

Teraz to prowadzi mnie do bardzo niefortunnej sytuacji, w której 0 z definicji jest poprawną wartością dla płci Demograficznej.Gender (0 ~ Gender.Female).

Najprostszym rozwiązaniem jest zmiana wyliczenia, aby 0 było stanem "nieokreślonym", który mógłbym sprawdzić. Nie mogę jednak zmienić wyliczenia. Mogłem utworzyć własne przeciążenie dla obiektu Demographics, ale wolałbym tego nie robić, ponieważ myślę, że musi być lepszy sposób.

Czy mogę jednoznacznie powiązać parametr płci z parametrem w identyfikatorze URI i zgłosić wyjątek, jeśli nie został przesłany?

Czytałem o konwerterach typów, ale musiałbym pracować nad ciągiem URI i sądzę, że będę musiał wdrożyć wiele funkcji, które podobno ma już WebApi.

Należy pamiętać, że muszę pracować nad identyfikatorem URI i nie mogę korzystać z treści żądania.

Odpowiedz

4

Co powiesz na wyłudzenie w ten sposób?

public class Demographics 
{ 
    public Gender? Gender { get; set; } 
} 

Wewnątrz metody działania, można po prostu sprawdzić, czy demographics.Gender jest null lub nie.

1

WebAPI zawiera ramy sprawdzania poprawności za pośrednictwem data annotations. To pozwala oznaczyć Gender-nieruchomość w Demografia obiekt jako [Wymagane]:

public class Demographics 
{ 
    [Required] 
    public Gender Gender { get; set; } 
} 

Następnie zaznaczyć kontroler lub metody kontrolera z [ValidateModel] przypisują wymusić sprawdzanie poprawności (czytaj o innych sposobów, aby zmusić to, npglobalnie: model validation):

[HttpGet] 
[ValidateModel] 
public string Get(int id, [FromUri]Demographics demographics) 
{ // etc.} 

Po tym, jeśli pominąć zapewnienie parametr, dostaniesz automatycznej walidacji i błąd 400 Bad Request z komunikatem:

{"Message":"The request is invalid.","ModelState":{"Gender":["The Gender field is required."]}} 

Nieprawidłowe wartości są obsługiwane poprawnie domyślnie, nawet bez wymaganego atrybutu, więc niepoprawna wartość Foo podana dla płci jest również odpowiedziana komunikatem 400 Bad Request:

{"Message":"The request is invalid.","ModelState":{"Gender":["The value 'Foo' is not valid for Gender."]}} 
Powiązane problemy