我试图验证,如果一个属性/字段在ModelState无效的请求中完全中断,并且BadRequest被发送回客户端,那么我很难处理请求体中的非空类型。
可空类型的工作
[Required] public string NullableString { get; set; }
适用于非空参数和可空参数。
public IActionResult RequiredNonNullableIntQueryString([Required]int nonNullableInt)
public IActionResult RequiredNullableStringQueryString([Required]string nullableString)
但是,它不适用于请求体中不可空的类型。
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,则认为缺少所需的值。非空字段总是有效的,所需属性的错误消息永远不会显示.
为什么?这似乎没什么意义。为什么要确保所有非零标记都是必需的,但如果没有提供错误,则忽略错误?
我知道许多建议,表明可以对以下内容进行黑客操作,从而将所需的参数设置为可空。对我来说,这似乎不是一个合理的解决办法。
public class NonNullablesRequest
{
[Required]
public int? NonNullableInt { get; set; }
}
这感觉很不对劲。
.HasValue
和.Value
来避免“可能的空”警告。如果未提供非空类型,是否有方法配置ModelBinding使ModelState无效?
编辑1:
似乎有相当多的争论:ASP.NET核心[要求]非空类型,我不确定我是否同意Chris的观点。这并不是说我们期望价值不被提供。事实上,恰恰相反,我想确保调用者给我这个值。但是,我们必须防止用户没有提供足够的数据,因此系统应该拒绝400 BadRequest的请求。
由此,预期的结果是int
,而不是int?
。如果未提供数据,则ModelBinder应指示ModelState无效。
然而,我可以看到这样的挑战: 1)反序列化和2) ModelBinding。
发布于 2020-06-09 10:08:42
为此您可以使用两个不同的类。
一个表示web应用程序发送到后端的内容,另一个表示域模型(例如实体模型)。
Http传输对象
public class YourWebAppDto
{
[Required]
public int? NonNullableInt { get; set; }
}
域模型对象
public class YourDomainModelObject
{
public int NonNullableInt { get; set; }
}
通过将这两个关注点分开,您可以在处理web应用程序潜在的无效输入时保持域模型的干净。
当然,你需要两者之间的映射。我们用的是自动驾驶。
我知道,这并不能直接回答你的问题,但作为看待事物的另一种方式,它可能会有所帮助。
干杯,迈克
https://stackoverflow.com/questions/62279845
复制相似问题