ASP.net WebApi参数从URI绑定到复杂类型

时间:2013-08-07 13:41:01

标签: c# asp.net .net asp.net-web-api

我想在.net 4.5

上使用ASP.net WebApi创建一个REST Web服务

网址应采用以下格式:

/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是上述格式,则默认映射可以正常工作。 但是,当然我还需要检查网址提供的参数是否正确。

ASP.net WebApi(afaik)默认情况下尝试根据假定的类型映射每个参数(或者如果它可以转换为该类型)。如果它在URI中找不到匹配的值,则假设它只是0。

现在这让我陷入了一个非常不幸的境地,根据定义,0仍然是Gender Demographics.Gender(0~Meminual.Female)的有效值。

最简单的解决方案是更改枚举,使0成为我可以检查的“不确定”状态。但是,我无法改变枚举。 我可以为Demographics对象创建自己的重载,但不想这样做,因为我认为必须有更好的方法。

我可以明确地将性别参数绑定到URI中的参数,并在未提交时抛出异常吗?

我读到了类型转换器,但我必须处理URI字符串,并认为我必须实现WebApi显然已有的很多功能。

请记住,我必须处理URI,不能使用请求正文。

2 个答案:

答案 0 :(得分:4)

如何使枚举可以像这样?

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

在action方法中,您只需检查demographics.Gender是否为null。

答案 1 :(得分:1)

WebAPI包含data annotations的验证框架。这允许您将Demographics对象中的Gender-property标记为[Required]:

C-x C-x M-\

然后,使用[ValidateModel]属性标记控制器或控制器方法以强制验证(阅读有关强制执行此操作的其他方法,例如全局:model validation):

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

在此之后,如果您错过了提供参数,您将获得自动验证和错误400 Bad Request并显示一条消息:

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

默认情况下,即使没有必需的属性,也会正确处理无效值,因此使用400 Bad Request消息也会响应提供给性别的不正确的Foo值:

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