FluentValidation.Net не производит ненавязчивую проверку на стороне клиента при использовании .SetValidator () - PullRequest
8 голосов
/ 31 января 2012

Я пытаюсь заставить клиентскую проверку работать на странице, которая использует шаблоны редактора.

Упрощенный пример модели моего вида, например:

[Validator(typeof(ValidationTestModelValidator))]
public class ValidationTestModel
{
    public string Name { get; set; }

    public string Age { get; set; }

    public ChildModel Child { get; set; }
}

Дочерняя модель, например:

public class ChildModel
{
    public string ChildName { get; set; }

    public string ChildAge { get; set; }
}

Мой валидатор, например:

public class ValidationTestModelValidator : AbstractValidator<ValidationTestModel>
{
    public ValidationTestModelValidator()
    {
        RuleFor(m => m.Name)
            .NotEmpty()
            .WithMessage("Please enter the name");

        RuleFor(m => m.Age)
            .NotEmpty()
            .WithMessage("Please enter the age");

        RuleFor(m => m.Age)
            .Matches(@"\d*")
            .WithMessage("Must be a number");

        RuleFor(m => m.Child)
            .SetValidator(new ChildModelValidator());
    }
}

И дочерний валидатор модели, например:

public class ChildModelValidator : AbstractValidator<ChildModel>
{
    public ChildModelValidator()
    {
        RuleFor(m => m.ChildName)
            .NotEmpty()
            .WithMessage("Please enter the name");

        RuleFor(m => m.ChildAge)
            .NotEmpty()
            .WithMessage("Please enter the age");

        RuleFor(m => m.ChildAge)
            .Matches(@"\d*")
            .WithMessage("Must be a number");
    }
}

Я зарегистрировал FluentValidation.Net с MVC3, добавив в Application_Start () следующее:

// Register FluentValidation.Net
FluentValidationModelValidatorProvider.Configure();

Это создает ненавязчивыйпроверка на стороне клиента идеально подходит для двух свойств Name и Age, но не для свойств в ChildModel.

Есть идеи, что я здесь не так делаю?

Обновление: Кажется, это работает нормально, если я просто аннотирую ChildModel с атрибутом Validator, однако я хочу применить проверку условно, отсюда и использование SetValidator ().

Ответы [ 3 ]

1 голос
/ 19 декабря 2012

Как вы указали в своем обновлении, вам нужно украсить дочерний тип с помощью валидатора, если вы хотите создать ненавязчивую разметку.Затем вы можете использовать это условно в «родительском» классе валидатора, либо поместив его в блок if, либо используя метод When () FluentValidation для использования выражения.

Также обратите внимание, что вы можететакже цепочка правил для свойств (т. е. используя свободный интерфейс):

RuleFor(m => m.ChildName)
    .NotEmpty()
    .WithMessage("Please enter the name")
    .Matches(@"\d*")
    .WithMessage("Must be a number");
1 голос
/ 05 сентября 2012

Я попытался проанализировать документацию http://fluentvalidation.codeplex.com/wikipage?title=mvc&referringTitle=Documentation. В нем говорится, что интеграция MVC работает на основе атрибутов по умолчанию, потому что его фабрика валидатора использует атрибут для создания экземпляра соответствующего валидатора.По-видимому, он проверяет ChildModel, на который ссылается свойство основной модели, но, возможно, это просто автоматический рекурсивный обход структуры модели для генерации кода проверки на стороне клиента.Таким образом, он может использовать тот же механизм, чтобы найти соответствующий валидатор для типа ChildModel.Не могли бы вы проверить, что произойдет, если вы удалите правило SetValidator (но оставите атрибут для ChildModel), будет ли оно по-прежнему генерировать валидаторы на основе атрибута?

Существует явный список валидаторов, которые поддерживаются на стороне клиента, но, к сожалению, SetValidator там не упоминается (или не объясняется), что является плохим признаком.

В документе также говорится, чтоправила, использующие условие, не поддерживаются на стороне клиента, поэтому, скорее всего, вы не сможете обойти это с помощью SetValidator (как вы указали в своем обновлении).

См. Также это обсуждение об условных правилах на стороне клиента: http://fluentvalidation.codeplex.com/discussions/393596. Было предложено реализовать условное правило в JS с jQuery Validation, однако это может быть сложно, если у вас сложная проверка, котораядолжен быть условно добавлен.

Как насчет того, чтобы позволить ему добавлять валидаторы с атрибутом, но впоследствии как-то их подавлять?Например, удалив ненавязчивые атрибуты из элементов впоследствии?

0 голосов
/ 05 сентября 2016

В случае, если какое-то другое тело имеет такую ​​же проблему:

Вам необходимо добавить атрибут валидатора на ChildModel тоже

[Validator(typeof(ChildModelValidator))]
public class ChildModel

и оставьте все остальные коды как есть, тогда они будут работать на стороне клиента

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...