Проверьте DateTime с FluentValidator - PullRequest
12 голосов
/ 15 октября 2011

Это мой ViewModel класс:

public class CreatePersonModel
{
    public string Name { get; set; }
    public DateTime DateBirth { get; set; }
    public string Email { get; set; }
}

CreatePerson.cshtml

@model ViewModels.CreatePersonModel
@{
    ViewBag.Title = "Create Person";
}

<h2>@ViewBag.Title</h2>

@using (Html.BeginForm())
{
    <fieldset>
        <legend>RegisterModel</legend>

        @Html.EditorForModel()

        <p>
            <input type="submit" value="Create" />
        </p>
    </fieldset>
}

CreatePersonValidator.cs

public class CreatePersonValidator : AbstractValidator<CreatePersonModel>
{
    public CreatePersonValidator()
    {
        RuleFor(p => p.Name)
            .NotEmpty().WithMessage("campo obrigatório")
            .Length(5, 30).WithMessage("mínimo de {0} e máximo de {1} caractéres", 5, 30)
            .Must((p, n) => n.Any(c => c == ' ')).WithMessage("deve conter nome e sobrenome");

        RuleFor(p => p.DateBirth)
            .NotEmpty().WithMessage("campo obrigatório")
            .LessThan(p => DateTime.Now).WithMessage("a data deve estar no passado");

        RuleFor(p => p.Email)
            .NotEmpty().WithMessage("campo obrigatório")
            .EmailAddress().WithMessage("email inválido")
            .OnAnyFailure(p => p.Email = "");
    }
}

При попытке создать человека с неверным форматом даты:

Error trying to save the person

замечания * * 1023 Как и в моем классе CreatePersonModel, свойство DateBirth имеет тип DateTime, проверка MVC asp.net для меня уже сделана. Но я хочу настроить сообщение об ошибке , используя FluentValidation . Я не хочу менять тип имущества по различным причинам, таким как: В классе CreatePersonValidator.cs проверка состоит в том, чтобы проверить, была ли дата в прошлом: .LessThan (p => DateTime.Now) Вопрос

Как настроить сообщение об ошибке без использования DataAnnotations (с помощью FluentValidator).

Ответы [ 4 ]

14 голосов
/ 31 августа 2012
public CreatePersonValidator()
{
    RuleFor(courseOffering => courseOffering.StartDate)
       .Must(BeAValidDate).WithMessage("Start date is required");

    //....
}

private bool BeAValidDate(DateTime date)
{
    return !date.Equals(default(DateTime));
}
3 голосов
/ 18 октября 2011

Посмотрите документацию по Fluent Validation на GitHub:

https://github.com/JeremySkinner/FluentValidation/wiki

Попробуйте добавить валидатор RegEx, чтобы гарантировать, что ввод пользователя (строка) может быть проанализирован как датаправильно, прежде чем применять Меньше чем Валидатор.

РЕДАКТИРОВАТЬ

Пройдя несколько тестов и посмотрев исходный код для Fluent Validator, я признаю, что вышеуказанный подход не будет работать.

Стандартная ошибка, которую вы получаете, добавляется на этапе привязки модели, который происходит до того, как свободная структура проверки сможет получить доступ и проверить модель.

Я предположил, что авторы структуры были умны и вводили своипроверочный код на этапе привязки модели.Похоже, что это не так.

Так что короткий ответ - то, что вы хотите сделать, не представляется возможным.

1 голос
/ 08 февраля 2012

Как упомянул Стюарт, невозможно использовать только FluentValidation, чтобы таким образом обойти привязку модели. Я бы предложил две идеи / предложения:

  1. Если вы действительно не можете изменить тип ViewModel с DateTime на строку, вы всегда можете очистить состояние модели самостоятельно после привязки модели и затем запустить валидатор вручную (я предполагаю, что вы подключили FluentValidation для автоматического выполнения после привязки модели).
  2. В подобных сценариях я бы изменил свойство на строку, но затем использовал AutoMapper , чтобы отобразить его в DateTime для любого запроса бизнес-объекта / модели домена / контракта на обслуживание, который мне нужен, чтобы в конечном итоге стать , Таким образом, вы получаете наибольшую гибкость при разборе и преобразовании с обеих сторон привязки модели.
0 голосов
/ 16 июля 2015

Попробуйте это

RuleFor(f =>
        f.StartDate).Cascade(CascadeMode.StopOnFirstFailure).NotEmpty()
                    .Must(date => date != default(DateTime))
                    .WithMessage("Start date is required");
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...