【问题标题】:ASP.net WebApi Parameter Binding to complex type from URIASP.net WebApi 参数从 URI 绑定到复杂类型
【发布时间】:2013-08-08 22:12:29
【问题描述】:

我想在 .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.}

Demographics 是一个自定义对象,基本上只是一个具有某些属性的 DTO。 但是,它包含一个具有自定义枚举类型的属性:

enum Gender
{
 Female = 0,
 Male
}

如果 URL 采用上述格式,默认映射就可以正常工作。 不过我当然也需要检查url提供的参数是否正确。

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

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

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

是否可以将性别参数显式绑定到 URI 中的参数,如果未提交则抛出异常?

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

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

【问题讨论】:

  • Enums 的一个好的经验法则是从值 1(即Female = 1, Male = 2)开始,这样您就不会将默认值注册为有效的 Enum 值

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


【解决方案1】:

WebAPI 包含一个通过data annotations 的验证框架。这允许您将 Demographics 对象中的性别属性标记为 [必需]:

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."]}}

【讨论】:

    【解决方案2】:

    这样让枚举可以为空怎么样?

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

    在action方法中,你可以检查demographics.Gender是否为空。

    【讨论】:

      猜你喜欢
      • 2016-01-22
      • 1970-01-01
      • 2019-05-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多