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

时间:2012-04-17 11:26:17

标签: c# asp.net-mvc-3 fluentvalidation

我将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
    }
}

我希望列表中的每个帐户都按照documentation中的说明进行修改。但是,对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"/>
}

4 个答案:

答案 0 :(得分:19)

以下内容应该有效:

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

答案 1 :(得分:1)

尝试使用:

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

答案 2 :(得分:0)

验证类:

smallBox.dispatchEvent(new CustomEvent('click'));

注意:我使用了最新的MVC 5(Nuget)版本的流畅验证。

答案 3 :(得分:0)

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