我将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"/>
}
答案 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();
}
}