当前位置: 首页 > 知识库问答 >
问题:

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

于捷
2023-03-14

我使用的是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个答案

梁韬
2023-03-14

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

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

陈朗
2023-03-14

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

null

null

阎功
2023-03-14

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)。而 则是通用的,因为它是在模型被反序列化之后应用的。

 类似资料:
  • .NET核心和ASP.NET核心到底有什么区别?

  • 我正在使用ASP.NET内核。我正在创建一个基本的WebAPI。我想在出现问题时显示一个JSON错误。 打印屏幕在我的屏幕上显示want I want。唯一的问题是它的发送状态码为200。 我可以通过这样做来解决问题: 真诚的,布莱希特

  • 19.2 核心与核心模块 谈完了整个开机的流程,您应该会知道,在整个开机的过程当中,是否能够成功的驱动我们主机的硬件配备, 是核心 (kernel) 的工作!而核心一般都是压缩文件,因此在使用核心之前,就得要将他解压缩后,才能载入内存当中。 另外,为了应付日新月异的硬件,目前的核心都是具有“可读取模块化驱动程序”的功能, 亦即是所谓的“ modules (模块化)”的功能啦!所谓的模块化可以将他想

  • 第二个编辑:在tsconfig.json的中添加之后,删除了导入和导出语句。不幸的是,这消除了我以前所做的改变的影响。我在中设置,以解决添加到所有文件顶部的问题。

  • javafx属性是将数据模型连接到javafx gui的好方法,因为它们的绑定模型实现了强大的通知更新机制。 属性和绑定并不严格地与GUI相关,而是对JavaBeans的扩展。 因此,我们希望在应用程序模型类中使用它们,而不引入对包的依赖关系,并且通常来自. 换句话说:(update) 我可能需要将应用程序分成两个模块。 一个模块应该只包含操作数据的类(模型类,说MVC)。 第二个模块将包含所有图

  • 我目前正在尝试为客户端界面-服务器交互构建一个API。我已经决定使用ASP.NET核心作为API,Nginx作为托管平台(在Ubuntu 18.04上)。由于ASP.NET使用Kestrel,我们设置了一个反向代理,将请求从Nginx转发到Kestrel——也就是托管API的服务器。我们在NGINX服务器上设置了SSL,但是它没有在Kestrel服务器上设置。 简单地说,我不知道如何在 Kestr