Свободные вопросы проверки и сбора в MVC 3 - PullRequest
3 голосов
/ 05 августа 2011

Я надеюсь, что мне здесь не хватает чего-то простого.

Я настроил Fluent Validation для интеграции с MVC, и до сих пор он работал довольно хорошо.Сейчас я работаю над сценарием, в котором пользователь выполняет стандартное создание так называемой «службы».У службы есть часы, которые необходимо определить.

Модель представления для этого действия Create определяется следующим образом:

[Validator(typeof (CreateServiceViewModelValidator))]
public class CreateServiceViewModel
{
    public string Name { get; set; }
    //...Other properties...
    public Collection<CreateServiceHoursViewModel> ServiceHours { get; set; }
}

, а CreateServiceHoursViewModel определяется как ...

public class CreateServiceHoursViewModel
{
    //...Other properties...
    public DayOfWeek DayOfWeekId { get; set; }
    public DateTimeOffset? OpenTime { get; set; }
    public DateTimeOffset? CloseTime { get; set; }
}

Быстрая и грязная версия пользовательского интерфейса выглядит следующим образом:

enter image description here

Проблема:

Свободные сообщения проверки для сбора часовне отображаются ожидаемые сообщения об ошибках.Они отображают стандартные сообщения об ошибках из Fluent Validation.

Вот мои валидаторы:

public class CreateServiceViewModelValidator : AbstractValidator<CreateServiceViewModel>
{
    public CreateServiceViewModelValidator()
    {
        RuleFor(f => f.Name).NotEmpty()
            .WithMessage("You must enter a name for this service.");

        RuleFor(f => f.Description)
            .NotEmpty().WithMessage("Service must have a description")
            .Length(3, 256).WithMessage("Description must be less than 256 characters.");

        RuleFor(f => f.ServiceHours).SetCollectionValidator(new CreateServiceHoursViewModelValidator());
    }
}

и HoursValidator

public class CreateServiceHoursViewModelValidator : AbstractValidator<CreateServiceHoursViewModel>
{
    public CreateServiceHoursViewModelValidator()
    {
        DateTimeOffset test;
        DayOfWeek enumTest;

        RuleFor(r => r.DayOfWeekId).Must(byteId => Enum.TryParse(byteId.ToString(), out enumTest)).WithMessage("Not a valid day of week...");

        RuleFor(f => f.OpenTime)
            .NotEmpty().WithMessage("Please specify an opening time...")
            .Must(openTime =>
                  DateTimeOffset.TryParse(openTime.HasValue ? openTime.Value.ToString() : String.Empty, out test))
            .WithMessage("Not a valid time...");

        RuleFor(f => f.CloseTime)
            .NotEmpty().WithMessage("Please specify a closing time...")
            .Must(closeTime =>
                  DateTimeOffset.TryParse(closeTime.HasValue ? closeTime.Value.ToString() : String.Empty, out test))
            .WithMessage("Not a valid time...");
    }
}

и с ошибками в часахколлекция:

enter image description here

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

var validator = new CreateServiceViewModelValidator();
var results = validator.Validate(model);

foreach (var result in results.Errors)
{
    Console.WriteLine("Property name: " + result.PropertyName);
    Console.WriteLine("Error: " + result.ErrorMessage);
    Console.WriteLine("");
}

Это возвращает сообщенияЯ бы ожидал.

Что я пропустил или сделал неправильно, что сообщения об ошибках для коллекции часов из беглых проверок не сохраняются на мой взгляд?(Валидаторы основных объектов работают, как и ожидалось)

Любая информация оценена!

(Я могу обновить с моим взглядом, если необходимо. Я чувствовал, что этот вопрос уже был достаточно долгим. Достаточно сказать, что у меня естьпредставление, использующее шаблон редактора для итерации набора часов обслуживания.)

@for (int weekCounter = 0; weekCounter <= 6; weekCounter++)
{
    @Html.DisplayFor(model => model.ServiceHours[weekCounter])
}

1 Ответ

3 голосов
/ 06 августа 2011

(добавлено к http://fluentvalidation.codeplex.com/discussions/267990)

Сообщения об ошибках, которые вы видите, не приходят от FluentValidation.

«Недопустимое значение для CloseTime» - это сообщение об ошибке MVC, сгенерированное до FluentValidation имеет шанс сработать.

Это происходит потому, что FluentValidation работает, проверяя весь объект после того, как все свойства были установлены, но в вашем случае строка «* Введите время закрытия здесь» не является допустимым DateTime, поэтому MVC не может фактически установить свойство в действительное время и генерирует ошибку.

...