Я надеюсь, что мне здесь не хватает чего-то простого.
Я настроил 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](https://i.stack.imgur.com/xmTwM.png)
Проблема:
Свободные сообщения проверки для сбора часовне отображаются ожидаемые сообщения об ошибках.Они отображают стандартные сообщения об ошибках из 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](https://i.stack.imgur.com/LwGLR.png)
Когда я запускаю метод 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])
}