首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >根据需要在正文中验证非空属性- AspNetCore 3.1

根据需要在正文中验证非空属性- AspNetCore 3.1
EN

Stack Overflow用户
提问于 2020-06-09 09:56:49
回答 1查看 3.6K关注 0票数 8

我试图验证,如果一个属性/字段在ModelState无效的请求中完全中断,并且BadRequest被发送回客户端,那么我很难处理请求体中的非空类型。

可空类型的工作

代码语言:javascript
运行
复制
[Required] public string NullableString { get; set; }

适用于非空参数和可空参数。

代码语言:javascript
运行
复制
public IActionResult RequiredNonNullableIntQueryString([Required]int nonNullableInt)

public IActionResult RequiredNullableStringQueryString([Required]string nullableString)

但是,它不适用于请求体中不可空的类型。

代码语言:javascript
运行
复制
 public IActionResult RequiredNonNullableIntBody([FromBody]NonNullablesRequest request)

 public class NonNullablesRequest
 {
    [Required] // I have also tried [BindRequired] with the same result.
    public int NonNullableInt { get; set; }
 }

我读过:

Microsoft文档指出:

.NET Core3.0及以后版本中的验证系统将非空参数或绑定属性视为具有必需的属性。诸如十进制和int之类的值类型是不可空的.

这很酷..。不过,后来说

在服务器上,如果属性为null,则认为缺少所需的值。非空字段总是有效的,所需属性的错误消息永远不会显示.

为什么?这似乎没什么意义。为什么要确保所有非零标记都是必需的,但如果没有提供错误,则忽略错误?

我知道许多建议,表明可以对以下内容进行黑客操作,从而将所需的参数设置为可空。对我来说,这似乎不是一个合理的解决办法。

代码语言:javascript
运行
复制
 public class NonNullablesRequest
 {
    [Required]
    public int? NonNullableInt { get; set; }
 }

这感觉很不对劲。

  • 数据类型不能准确地表示到达请求的期望。
  • 每次访问属性时都必须使用.HasValue.Value来避免“可能的空”警告。
  • 似乎是C# 8.0的可空引用类型(C#引用)的反模式。

如果未提供非空类型,是否有方法配置ModelBinding使ModelState无效?

编辑1:

似乎有相当多的争论:ASP.NET核心[要求]非空类型,我不确定我是否同意Chris的观点。这并不是说我们期望价值不被提供。事实上,恰恰相反,我想确保调用者给我这个值。但是,我们必须防止用户没有提供足够的数据,因此系统应该拒绝400 BadRequest的请求。

由此,预期的结果是int,而不是int?。如果未提供数据,则ModelBinder应指示ModelState无效。

然而,我可以看到这样的挑战: 1)反序列化和2) ModelBinding。

EN

回答 1

Stack Overflow用户

发布于 2020-06-09 10:08:42

为此您可以使用两个不同的类。

一个表示web应用程序发送到后端的内容,另一个表示域模型(例如实体模型)。

Http传输对象

代码语言:javascript
运行
复制
 public class YourWebAppDto
 {
    [Required]
    public int? NonNullableInt { get; set; }
 }

域模型对象

代码语言:javascript
运行
复制
 public class YourDomainModelObject
 {
    public int NonNullableInt { get; set; }
 }

通过将这两个关注点分开,您可以在处理web应用程序潜在的无效输入时保持域模型的干净。

当然,你需要两者之间的映射。我们用的是自动驾驶。

我知道,这并不能直接回答你的问题,但作为看待事物的另一种方式,它可能会有所帮助。

干杯,迈克

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/62279845

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档