ここで簡単なものが欠けていることを願っています。
私はMVCと統合するためにFluentValidationを構成しましたが、これまでは非常にうまく機能しています。私は現在、ユーザーが「サービス」と呼ばれるものの標準的な作成を実行しているシナリオに取り組んでいます。サービスには、定義する必要のある時間があります。
この作成アクションのビューモデルは、次のように定義されています。
[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; }
}
UIのクイックバージョンとダーティバージョンは、次のようになります。
問題:
時間の収集に関する流暢な検証メッセージは、予期されたエラーメッセージを示していません。FluentValidationからの標準エラーメッセージが表示されています。
これが私のバリデーターです:
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...");
}
}
時間の収集にエラーがあります。
コントローラアクションで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])
}