Asp.net core CustomConverter与web api中同一类上的属性进行比较

Asp.net core CustomConverter与web api中同一类上的属性进行比较,asp.net-core,asp.net-web-api,json.net,asp.net-core-2.2,Asp.net Core,Asp.net Web Api,Json.net,Asp.net Core 2.2,我一直在编写一些CustomConverter,扩展NewtonSoftsJSONConverter,但偶然发现了一个小问题。假设一个类有两个属性,但它们不能是相同的值。是否有可能在转换器中找到另一个属性的值。。。例如,假设我有一个这样的模型 我希望能够在CustomCompareConverter中检查姓氏的值,以确保其值与Firstname不同 public class Person { [JsonConverter(typeof(CustomCompareConverter), "

我一直在编写一些CustomConverter,扩展NewtonSoftsJSONConverter,但偶然发现了一个小问题。假设一个类有两个属性,但它们不能是相同的值。是否有可能在转换器中找到另一个属性的值。。。例如,假设我有一个这样的模型

我希望能够在CustomCompareConverter中检查姓氏的值,以确保其值与Firstname不同

public class Person
{
    [JsonConverter(typeof(CustomCompareConverter), "Surname")]
    public string Firstname { get; set; }

    public string Surname { get; set; }
}
```

您正试图通过json反序列化过程来完成多项真正应该分开的工作

  • 将一些外部json转换为域对象

  • 正在验证域对象

  • 姓氏与FirstName属性不匹配是您所在域的一项业务规则。因此,将其保留在您的域内。你可以:

  • 编写一个单独的验证器类来检查 person对象并返回验证失败的列表
  • 在Person类上实现
    IValidatableObject
    ,并实现 接口
  • 编写如下所示的自定义验证器

  • 将JSON反序列化过程用作反损坏层,以将外部系统的详细信息保留在域结构之外。获取extnal对象并将其转换为域对象后,使用常规方法验证域对象。

    您无法访问子对象的
    ReadJson()
    方法中的父对象属性,可能是因为JSON对象是一组无序的名称/值对,所以父属性可能没有被读入和反序列化。例如,考虑在事件中进行验证。这回答了你的问题吗?我大体上同意,但是。。。您已经序列化到一个对象,这意味着您已经丢失了验证发生的上下文。举个例子,我有一份客户名单。对象本身的验证不会为发生验证失败的客户提供任何上下文。是1号顾客还是1000号顾客?这是整个验证部分的一个大问题(除非有人告诉我其他情况)。您将对列表中的每个项目调用Validate。你怎么会不知道哪一个失败了呢?让我重新说一遍对不起。当然,我知道哪个person对象没有通过验证。我无法告诉消费者这是客户[12]。问题出在名字上(除非我做错了什么)。我所能说的是,正在验证的客户是错误的。因此,如果100个客户中有3个客户失败,我所能做的就是输出3条错误消息。如果使用IValidatableObject,则会得到一个IEnumerable,以便知道失败的对象和失败的原因。你还需要什么?它没有告诉我1)集合中失败的确切项目2)请求中失败的行3)文件中的位置。这也意味着你会得到两组错误。第一个是json验证,第二个是对象验证。这不是一个很好的用户体验,是吗。他们可能需要提交两次请求才能获得一个working rest服务调用。