微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

当模型使用DataAnnotations包含另一个类的对象作为属性时,如何在控制台应用程序的.Net Core 3.1中验证模型? 更新

如何解决当模型使用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中收到的错误消息为:

PayerId is required.

但是我没有得到自定义类的验证。如何在 .Net Core Console应用程序中实施此操作? 我对.Net Core相当陌生,因此不胜感激。谢谢!


更新:

我遵循@John H给出的答案,但是仍然存在一个问题。

如果我的要求是:

'Provider' : {
      'TaxId' : null
}

它将正常工作,因为它能够识别出这是ProviderInfo对象的类型。

但是,如果我的请求中不包含有关提供商的任何信息:

{
'ExternalVisitID': '123456789','EVVMSID': '100',}

然后它将无法验证对象。

解决方法

总之,这不起作用,因为TryValidateObject不支持复杂嵌套类型的验证。对于这种.NET Framework版本,这也是一个问题,@ reustmd创建了NuGet Package来解决该问题。不幸的是,它不支持.NET Core,但是我发现有一个package forked from this支持。从自述文件:

安装

以NuGet-Package dataannotationsvalidator的形式提供:

安装包数据注释验证器

用法

查看文件DataAnnotationsValidator/DataAnnotationsValidator.Tests/DataAnnotationsValidatorTests.cs

简短示例:

var validateator =新的DataAnnotationsValidator.DataAnnotationsValidator();

varvalidationResults = new List ();

validator.TryValidateObjectRecursive(modelToValidate,validationResults);

这应该可以解决您的问题。

顺便说一句,我还发现this proposal讨论了将此功能添加到.NET。如果您对该提案的技术设计讨论感兴趣,那么.NET Foundation会discussing发布一个视频。

更新

对于上述情况,我已经安装了上述软件包,更改了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不开箱即用支持此功能的原因,因为人们对其功能应该有不同的期望。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。