fluentvalidation错误消息包含c#属性名称,而不包含客户端json属性名称?

Sah*_*rma 1 c# json fluentvalidation asp.net-web-api

我有一个C#WebApi项目,并且正在使用FluentValidation.WebApi包来验证客户端输入。

下面是我的模型类代码,它具有名为“ IsPremium”的C#属性。对于所有客户端,此属性均具有json名称“ isLuxury”。

[Serializable, JsonObject, Validator(typeof(ProductValidator))]
public class Product
{
    [JsonProperty("isLuxury")]
    public bool? IsPremium { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

我的验证器类如下所示:

public class ProductValidator : AbstractValidator<Product>
    {
        public ProductValidator()
        {
            RuleFor(product => product.isPremium).NotNull();
        }
    }
Run Code Online (Sandbox Code Playgroud)

所以对于这样的请求: http:// localhost:52664 / api / product

请求正文:{“ isLuxury”:“”}

我收到以下错误:

{
  "Message": "The request is invalid.",
  "ModelState": {
    "product.isPremium": [
      "'is Premium' must not be empty."
    ]
  }
}
Run Code Online (Sandbox Code Playgroud)

流利的选择了C#属性名称,这对客户端没有意义,因为它知道它是“ isLuxury”。如何强制Fluent从json属性而不是c#属性中选择名称,以提供更好的验证,例如“'isLuxury'不能为空。”?

如果不可能的话,我将不得不重命名我所有的C#属性,使其具有与公开给所有客户端的json相同的名称。请提出您是否还有其他更好的方法来解决此问题。

Sah*_*rma 5

使用OverridePropertyName方法修改验证器类

public class ProductValidator : AbstractValidator<Product>
    {
        public ProductValidator()
        {
            RuleFor(product => product.isPremium).NotNull().OverridePropertyName("isLuxury");
        }
    }
Run Code Online (Sandbox Code Playgroud)

引用:https : //github.com/JeremySkinner/FluentValidation/wiki/d.-Configuring-a-Validator#overriding-the-default-property-name

或者,您可以调用WithName执行类似操作的方法。如果您想完全重命名该属性,则可以使用该OverridePropertyName方法。