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

本文关键字:验证 字符串 列表 何使用 | 更新日期: 2023-09-27 18:31:26

我有一个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
    }
}

我希望列表中的每个帐户都按照文档中的说明进行评估。 但是,对SetCollectionValidator的调用不起作用,因为使用List<string>时这不是一个选项,尽管如果该选项定义为List<Account>,则该选项将存在。 我错过了什么吗? 我可以更改我的模型以使用 List<Account>然后定义一个 Account 类,但我真的不想更改我的模型以适应验证。

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

@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"/>
}

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

以下方法应该有效:

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);
    }
}

尝试使用:

public class AccountsValidator : AbstractValidator<AccountViewModel>
{
   public AccountsValidator()
   {
       RuleForEach(x => x.Accounts).NotNull()
   }
}

你可以使用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();      
        }
    }

验证类:

using FluentValidation;
using System.Collections.Generic;
namespace Test.Validator
{
    public class EmailCollection
    {
        public IEnumerable<string> email { get; set; }
    }
    public class EmailValidator:  AbstractValidator<string>
    {
        public EmailValidator()
        {
            RuleFor(x => x).Length(0, 5);
        }
    }
    public class EmailListValidator: AbstractValidator<EmailCollection>
    {
        public EmailListValidator()
        {
            RuleFor(x => x.email).SetCollectionValidator(new EmailValidator());
        }
    }

}

注意:我使用了最新的MVC 5(Nuget)版本的fluentvalidation。