c# - 当模型包含另一个类的对象作为使用 DataAnnotations 的属性时,如何在控制台应用程序中验证 .Net Core 3.1 中的模型?
问题描述
我有以下请求模型:
public class VisitRequest
{
public ProviderInfo Provider { get; set; }
[Required]
[MaxLength(64)]
public string PayerId { get; set; }
}
我有如下自定义类:
public class ProviderInfo
{
[Required]
[MaxLength(15)]
public string TaxId { get; set; }
[Required(ErrorMessage = " Qualifier is required.")]
[MaxLength(15)]
public string NPI { get; set; }
}
我目前正在使用 ValidationContext 进行模型验证:
var visitData = JsonConvert.DeserializeObject<VisitRequest>(jsonString);
var vc = new ValidationContext(visitData);
var errorResults = new List<ValidationResult>();
var isValid = Validator.TryValidateObject(visitData, vc, errorResults, true);
我的演示 json 请求如下:
{
'Member': {
'Qualifier': 'MedicaidID',
'Identifier': '100'
},
'ExternalVisitID': '123456789',
}
现在我在 ErrorResult 中收到 ErrorMessage 为:
PayerId is required.
但我没有得到自定义类的验证。如何在.Net Core Console 应用程序中实现这一点?我对 .Net Core 还是很陌生,因此我们将不胜感激。谢谢!
更新 :
我遵循了@John H 给出的答案,但仍然存在一个问题。
如果我的要求是:
'Provider' : {
'TaxId' : null
}
它会正常工作,因为它能够识别这是类型 ProviderInfo 对象。
但是,如果我的请求不包含有关 Provider 的任何信息:
{
'ExternalVisitID': '123456789',
'EVVMSID': '100',
}
那么它就无法验证该对象。
解决方案
简而言之,这不起作用,因为TryValidateObject
不支持复杂嵌套类型的验证。对于这种类型的 .NET Framework 版本,这也是一个问题,@reustmd 创建了一个NuGet 包来解决这个问题。不幸的是,它不支持 .NET Core,但我发现有一个从中派生出来的包。从自述文件:
安装
作为 NuGet-Package 提供
dataannotationsvalidator
:安装包数据注解验证器
用法
见文件
DataAnnotationsValidator/DataAnnotationsValidator.Tests/DataAnnotationsValidatorTests.cs
简短的例子:
var 验证器 = 新的 DataAnnotationsValidator.DataAnnotationsValidator();
var validationResults = new List<ValidationResult>();
validator.TryValidateObjectRecursive(modelToValidate, validationResults);
这应该可以解决您的问题。
顺便说一句,我还发现这个提案讨论了将这个功能添加到 .NET。如果您对该提案的技术设计讨论感兴趣,请参阅 .NET 基金会发布的视频讨论它。
更新
对于上面的场景,我已经安装了上面的包,更改了VisitRequest
类以使提供程序成为必需
public class VisitRequest
{
[Required]
public ProviderInfo Provider { get; set; }
[Required]
[MaxLength(64)]
public string PayerId { get; set; }
}
然后运行以下命令:
var jsonString = @"{
""ExternalVisitID"": ""123456789"",
""EVVMSID"": ""100""
}";
var modelToValidate = JsonConvert.DeserializeObject<VisitRequest>(jsonString);
var validator = new DataAnnotationsValidator.DataAnnotationsValidator();
var validationResults = new List<ValidationResult>();
validator.TryValidateObjectRecursive(modelToValidate, validationResults);
foreach (var item in validationResults)
{
Console.WriteLine(item.ErrorMessage);
foreach (var memberName in item.MemberNames)
{
Console.WriteLine($"\t{memberName}");
}
}
产生以下输出:
The Provider field is required.
Provider
The PayerId field is required.
PayerId
如果您想单独列出缺少的提供程序的每个字段,即使 JSON 的那部分是空的,我认为您必须派生 NuGet 包并进行这些更改。但这可能是 .NET 没有开箱即用地支持此功能的一个原因,因为人们对它的行为方式有不同的期望。
推荐阅读
- c# - C# - Visual Studio 建议我将属性重命名为已经存在的其他内容
- bash - bash source 一个结尾有退出命令的文件
- javascript - javascript中的DOT.files?这是什么意思?
- javascript - AWS Lambda & API Gateway - 来自浏览器的 500 但不是来自 curl
- ios - 关闭一个自定义弹出 UIViewController 并立即呈现另一个自定义弹出 UIViewController -SWIFT
- mongodb - 当我在终端中输入 mongod 时,我的 MongoDB 不工作
- angular - 部署失败时的角度 6 路由
- python - 在 Google VM (Ubuntu) 上安装 TA-lib
- python - 使用 pandas 的 csv 值总和
- wix - 错误 CNDL0027:File/@Name 属性的值不是有效的 8.3 兼容名称