当前位置: 首页 > 知识库问答 >
问题:

如何使用Fluent验证对列表中的每个字符串进行验证?

令狐烨烨
2023-03-14

我将MVC3视图模型定义为:

[Validator(typeof(AccountsValidator))]
public class AccountViewModel
{
    public List<string> Accounts { get; set; }
}

使用FluentValidation(v3.3.1.0)将验证定义为:

public class AccountsValidator : AbstractValidator<AccountViewModel>
{
    public AccountsValidator()
    {
        RuleFor(x => x.Accounts).SetCollectionValidator(new AccountValidator()); //This won't work
    }
}

账户验证可能被定义为:

public class AccountValidator : AbstractValidator<string> {
    public OrderValidator() {
        RuleFor(x => x).NotNull();
        //any other validation here
    }
}

我希望列表中的每个帐户按照留档中的描述进行验证。但是,调用SetCollectValidator不起作用,因为在使用List时,这不是一个选项

作为参考,这是我使用的视图:

@model MvcApplication9.Models.AccountViewModel

@using (Html.BeginForm())
{
    @*The first account number is a required field.*@
    <li>Account number* @Html.EditorFor(m => m.Accounts[0].Account) @Html.ValidationMessageFor(m => m.Accounts[0].Account)</li>

    for (int i = 1; i < Model.Accounts.Count; i++)
    {
        <li>Account number @Html.EditorFor(m => m.Accounts[i].Account) @Html.ValidationMessageFor(m => m.Accounts[i].Account)</li>
    }

    <input type="submit" value="Add more..." name="add"/>
    <input type="submit" value="Continue" name="next"/>
}

共有3个答案

百里鸿祯
2023-03-14

您可以使用RuleForeach有一个简单的类,其中包含字符串列表

   public class Request
    {
        public IEnumerable<string> UserIds { get; set; }      
        public string  Body { get; set; }        
    }

我创建了下一个验证器

public class RequestValidator : AbstractValidator<Request>
    {
        public RequestValidator()
        {        
            RuleForEach(x => x.UserIds).NotNull().NotEmpty();            
            RuleFor(x => x.Body).NotNull().NotEmpty();      
        }
    }
姜杜吟
2023-03-14

尝试使用:

public class AccountsValidator : AbstractValidator<AccountViewModel>
{
   public AccountsValidator()
   {
       RuleForEach(x => x.Accounts).NotNull()
   }
}
马阳曦
2023-03-14

以下方面应起作用:

public class AccountsValidator : AbstractValidator<AccountViewModel>
{
    public AccountsValidator()
    {
        RuleFor(x => x.Accounts).SetCollectionValidator(
            new AccountValidator("Accounts")
        );
    }
}

public class AccountValidator : AbstractValidator<string> 
{
    public AccountValidator(string collectionName)
    {
        RuleFor(x => x)
            .NotEmpty()
            .OverridePropertyName(collectionName);
    }
}
 类似资料:
  • 我有一个电子邮件地址字段,其中有一个客户端验证,不允许几个临时域,如tempmailder.com或dispostable.com. 在服务器端,我使用了fluent验证来指定验证规则。 web中不允许的临时域。将文件配置为逗号分隔的字符串。 我是否可以指定一种方法来验证用户根据不允许的电子邮件域列表输入的值。 谢啦

  • 列表字段中bean的条件验证。 我对bean验证有一个小问题。我想做一个条件验证,但是被验证的类有一个必须被验证的bean列表作为字段,这些bean的一些字段必须被条件验证。这里有一个示例代码: 我可以在子bean上做一个循环,并分别验证每个子bean,但错误中的路径是错误的 另外,我可以使用这样的解决方案:使用Hibernate Validator(JSR 303)进行跨域验证,但它似乎弄乱了与

  • 问题内容: 我正在尝试 使用&Hibernate验证来验证 String Date 。我需要检查给定的字符串日期应该是过去的日期,并且应该是正确的格式,并具有所有限制,例如leap年,日。 我尝试使用此代码,但无法正常工作。有什么解决办法。如果我们有自定义验证器,那么它是否在字段级别。请提供建议或代码段。 问题答案: 选项1 将您的模式更改为此: 但是请记住,这种验证不会检查2月是否少于28/29

  • 我试图遍历每个数字索引,并过滤所述索引中excepted_words的任何实例。这个程序的输出似乎几乎没有修改,如果有的话。我该怎么解决这个问题? 输出:

  • 我有一个endpoint,其响应如下: 状态的可能值如下:活动、非活动、已删除。要检查架构,我尝试了以下操作: 为了验证,我使用以下句子:然后匹配 但它不起作用。这就是错误所在 实际值:“活动”,应为:[“已删除”、“活动”、“非活动”],原因:实际值与列表中的值不同 你能帮帮我吗?

  • 我有下面的代码 我希望验证这是否是HTML的正确格式,因为它包含许多变量,如果出现问题,很难进行调试。