可以对值类型强制执行[必需]

时间:2017-09-20 14:36:26

标签: c# asp.net-web-api2 deserialization data-annotations c#-6.0

如果将[Required]放在引用类型上,并提供没有匹配的JSON属性的JSON,则会引发错误。

除了使用可空值类型或在类中包装值类型之外,是否可以在对Web API进行反序列化时对值类型强制执行[必需]?

要求不在下面的Test1上强制执行,因为它被强制为默认值零。即,如果您的JSON没有包含Field1属性,则序列化仍会成功完成。

我希望能够将[Required]放在我的值类型上,或者可能写一个新属性来完成此任务。

有设置可以做到这一点吗?或者,是否可以利用XML和JSON的反序列化来实现这一目标?

public async Task<IHttpActionResult> Method1(Clas1 model){}

public class Class1
{
    ...

    [Required]
    public int Field1 { get; set; }
}

Although it may not be possible with attributes,理论上解串器可以在将值强制转换为值类型之前检查属性。如果是的话,是否有我可以做的事件或设置?

使用Json.net,我可以添加一个属性[JsonProperty(Required = Required.AllowNull)]。我可以为XML反序列化做些类似的工作吗?

即:

// POST api/Account/Register
[AllowAnonymous]
[Route("Register")]
public async Task<IHttpActionResult> Register(RegisterBindingModel model)
{
    if (!ModelState.IsValid)
    {
        return BadRequest(ModelState);
    }

    var user = new ApplicationUser() { UserName = model.Email, Email = model.Email };

public class RegisterBindingModel  //: IValidatableObject
{
    [Required]
    public string Email { get; set; }

    public int Test1 { get; set; }

    [Required]
    public int Test3 { get; set; }

<RegisterBindingModel xmlns:i="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://schemas.datacontract.org/2004/07/WebApplication1.Models">
  <Email>Sample string 2</Email>
  <Test1>2</Test1>
</RegisterBindingModel>

1 个答案:

答案 0 :(得分:1)

如果您知道范围,则可以使用范围属性。

[Range(0, 99)]
public int Field1{ get; set; }