问题标签 [modelstatedictionary]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
1 回答
208 浏览

validation - 如何在 ASP.NET Core 中为 JsonPatch 应用部分 ModelState 验证

我一直在努力解决一个问题,即如果您在 ASP.NET Core 中使用数据注释进行模型验证并运行patchDoc.ApplyTo(newData);,然后if (!TryValidateModel(newData))您会遇到补丁文档中未包含的操作的模型验证错误。

如果一个属性之前为 null 并且它有一个[Required]属性,它将给出模型状态验证错误,尽管我没有在补丁文档中包含该属性。

0 投票
2 回答
94 浏览

c# - ModelStateDictionary - 识别不应返回给调用者的错误

我有一个简单的 Web API,它使用验证属性执行一些基本验证。如果请求不满足验证要求,我会从中提取错误消息ModelStateDictionary并将其作为字典返回给调用者,其中键是出现错误的属性的路径,消息指示问题所在。

问题是,给定某些输入,错误消息ModelStateDictionary通常包含我不想返回给客户端的信息(例如转换器尝试将 JSON 映射到的对象的全名(包括命名空间)) .

是否可以区分验证错误(由 Validation Attributes / IValidatableObject 实现生成)和尝试将无效 JSON 映射到某个对象而生成的错误?

例如:

我的模型

我的操作方法

我的示例输入:

  1. 缺少所需数据

因为Customer.Name用 装饰RequiredAttribute,这会生成以下错误消息:

这可以返回给调用者,所以这里没有问题。

  1. JSON 值不映射到 .Net 对象类型

由于将值反序列化为123对象Customer失败,因此会生成以下错误消息:

不能返回给调用者,因为它包含映射到的对象的完整命名空间路径。在这种情况下,应该使用通用的东西(例如"Bad JSON value.")作为错误消息。

谁能帮我找到隐藏这些错误消息的解决方案,这些错误消息包含不应返回给调用者的信息?


从上面的代码中可以看出,我认为我可以检查ModelEntry.Exception属性并使用它来确定是否需要对调用者屏蔽错误消息,但在我的两个示例中都是 null。

解决方案可能是检查错误消息是否以 开头Error converting value,如果是,则屏蔽来自调用者的消息。这似乎不是很健壮,我不确定这在现实世界的例子中有多可靠。