Как вы проверяете каждую строку в списке с помощью Fluent Validation?
У меня есть модель просмотра 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"/>
}
Ответы
Ответ 1
Следующее должно работать:
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);
}
}
Ответ 2
Попробуйте использовать:
public class AccountsValidator : AbstractValidator<AccountViewModel>
{
public AccountsValidator()
{
RuleForEach(x => x.Accounts).NotNull()
}
}
Ответ 3
Классы проверки:
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) для проверки наличия флюенса.
Ответ 4
Вы могли бы использовать 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();
}
}