gpt4 book ai didi

c# - 流畅的验证不适用于列表对象

转载 作者:行者123 更新时间:2023-12-02 00:46:01 28 4
gpt4 key购买 nike

我正在尝试验证我的 webApi 2 中的输入对象列表。

但它没有验证。 Modelstate 始终设置为 true。

示例代码:

public class A
{
public int Id { get; set; }
public string Name { get; set; }
}

public class ClassAValidator : AbstractValidator<A>
{
public classAValidator()
{
RuleSet("ClassA",()=>{
RuleFor(x => x.Id).NotEmpty().WithMessage("The Idcan't be Empty or Zero");
RuleFor(x => x.Name).NotEmpty().Length(10).WithMessage("Name Should be Six Char length");
});
}
}

注意:字符串字段我们需要精确到6个字符。

应用程序接口(interface):

 [HttpPut]
public async Task<IHttpActionResult> Put([FromBody] List<A> alist)
{
if(!ModelState.IsValid) throw new InvalidDataException(ModelState,"Data Validation Failed for Upload Class A");
// Model State is Always true
}

谁能指出我遗漏的地方?

更新:我试过如图 Should i create a new Type for Collection in FluentValidation?

但仍然有同样的问题。

已解决的更新:

问题是规则集的使用导致验证未被触发。在删除“RuleSet”时,即使没有定义 List[A] Validator 类,它也能正常工作。

来自 Jeremy Skinner 的消息:第一个问题是您的规则包含在规则集中,因此它们永远不会被执行。规则集是可选的,自动集成只调用不在规则集中的规则。

最佳答案

首先,ModelState.IsValid是一个 ASP.NET MVC 结构,用于验证(默认情况下)模型绑定(bind)是否正确完成。除非您在 MVC 配置中设置它,否则它与 FluentValidation 无关。

您需要确保正在调用验证器。验证 A 的列表和它的元素,你需要两个验证器:一个用于类型 A , 一个用于 A 的列表/集合/IEnumerable :

public class ClassAValidator : AbstractValidator<A>
{
public ClassAValidator()
{
RuleFor(x => x.Id).NotEmpty().WithMessage("Id can't be empty");
RuleFor(x => x.Name).NotEmpty().Length(10).WithMessage("Name should have length 10");
}
}

public class ClassACollectionValidator : AbstractValidator<IEnumerable<A>>
{
public ClassACollectionValidator ()
{
RuleFor(x =>x).SetCollectionValidator(new ClassAValidator());
}
}

然后您可以按如下方式验证您的列表

 [HttpPut]
public async Task<IHttpActionResult> Put([FromBody] List<A> alist)
{
if(!ModelState.IsValid) throw new InvalidDataException(ModelState,"Data Validation Failed for Upload Class A");

var validator = new ClassACollectionValidator();
var result = validator.Validate(alist);
}

或者,您可以按如下方式组合两个验证器:

public class ClassACollectionValidator : AbstractValidator<IEnumerable<A>>
{
public ClassACollectionValidator ()
{
RuleForEach(x => x.Id).NotEmpty().WithMessage("Id can't be empty");
RuleForEach(x => x.Name).NotEmpty().Length(10).WithMessage("Name should have length 10");
}
}

关于c# - 流畅的验证不适用于列表对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43741961/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com