2013-08-07 1 views
5

Я хочу создать REST веб-сервиса с помощью ASP.net WebAPI на .net 4.5ASP.net WebAPI Параметр Связывание сложного типа из URI

Urls должен быть в формате, как это:

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

Соответствующий контроллер выглядит следующим образом:

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

Где Демография является пользовательским объектом, который в основном только DTO с определенными свойствами. Однако, она содержит одно свойство, которое имеет тип пользовательского перечисления:

enum Gender 
{ 
Female = 0, 
Male 
} 

отображение по умолчанию работает просто отлично, если URL имеет выше формат. Однако, конечно, мне также нужно проверить правильность параметров, предоставляемых URL-адресом.

ASP.net WebApi (afaik) по умолчанию пытается сопоставить каждый параметр на основе предполагаемого типа (или если он может быть преобразован в этот тип). Если он не может найти подходящее значение в URI, он предположил, что он равен 0.

Теперь это приводит меня к очень неудачной ситуации, когда 0 по определению все еще является допустимым значением для Gender Demographics.Gender (0 ~ Пол. Женский).

Простейшим решением было бы изменить перечисление так, чтобы 0 было «неопределенным» состоянием, которое я мог проверить. Однако я не могу изменить перечисление. Я мог бы создать свою собственную перегрузку для объекта Demographics, но предпочел бы этого не делать, потому что я думаю, что должен быть более приятный способ.

Могу ли я привязать параметр gender к параметру в URI и выбросить исключение, если оно не было отправлено?

Я читал о преобразователях типов, но мне пришлось бы работать с строкой URI и думать, что мне придется реализовать много функциональных возможностей, которые, по-видимому, уже есть в WebApi.

Пожалуйста, имейте в виду, что я должен работать с URI и не могу использовать Тело запроса.

ответ

4

Как насчет того, чтобы перечисление было равно NULL, как это?

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

Внутри метода действия, вы можете просто проверить, если demographics.Gender равно нулю или нет.

1

WebAPI содержит рамки проверки через data annotations. Это позволяет маркировать Гендерное свойство в Демография объект как [Требуется]:

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

Затем отметьте контроллер или метод контроллера с [ValidateModel] атрибутом, чтобы заставить проверку (читать о других способах заставить это, напримерглобально: model validation):

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

После этого, если вы пропустите, чтобы обеспечить этот параметр, вы получите автоматическую проверку и ошибка 400 Bad Request с сообщением:

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

недопустимые значения обрабатываются по умолчанию, даже без обязательного атрибута, поэтому неверное значение Foo, предоставленное полу, также отвечает сообщением 400 Bad Request:

{"Message":"The request is invalid.","ModelState":{"Gender":["The value 'Foo' is not valid for Gender."]}} 
Смежные вопросы