提问者:小点点

在ASP.NET核心模型与JSON主体绑定中使用Required和JsonRequired


我使用的是ASP.NET Core2.0,我有一个像这样注释的请求对象:

public class MyRequest
{
    [Required]
    public Guid Id { get; set; }

    [Required]
    public DateTime EndDateTimeUtc { get; set; }

    [Required]
    public DateTime StartDateTimeUtc { get; set; }
}

在我的控制器中:

public async Task<IActionResult> HandleRequest([FromBody] MyRequest request)
{ /* ... */ }

null

但当我有这样的身体:

{
  "hello": "a-string-value!"
}

null

当然,当我缺少所有属性时,就会发生这种情况,而唯一存在的一个参数的名称与该属性不匹配(甚至这个参数的类型也是,它与我的模型中的任何类型都不匹配)。

因此,在某种程度上,如果我的请求中没有任何内容,这些属性似乎可以工作,但是如果我的请求不是空的,它们就什么也不做!

在准备这个问题时,我注意到还有一个属性,它似乎负责处理当前的属性。

那么,之间有什么区别呢?


共3个答案

匿名用户

null

public class MyRequest
{
    [Required]
    public Guid? Id { get; set; }

    [Required]
    public DateTime? EndDateTimeUtc { get; set; }

    [Required]
    public DateTime? StartDateTimeUtc { get; set; }
}

现在,如果您发送的请求缺少,则相应字段将设置为将设置为,且将包含错误描述,例如

属性特定于JSON.NET。它在反序列化期间播放,而属性(与命名空间中的其他属性一样)在模型反序列化之后,在模型验证期间播放。如果违反了属性,则完全不会反序列化模型,并将相应的动作参数设置为

您应该首选属性而不是的主要原因是不适用于其他内容类型(如XML)。而则是通用的,因为它是在模型被反序列化之后应用的。

匿名用户

当您使用作为绑定源时,模型属性将获得默认值,而将被忽略。有一个相关的问题是“参数验证的问题”。

null

null

匿名用户

是的,困难在于,如果您选择Required,web请求的客户端的语义会发生错误的变化--也就是说,当您真正需要一个正确的值时,您说您可以传入一个null。

使用JsonRequired对此进行排序,但这是由NewtonSoft提供的,因此当您升级到。NET Core3时将停止工作。这是因为。NET Core3使用自己的Json解析器而不是NewtonSoft。