3

ここで簡単なものが欠けていることを願っています。

私は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])
}
4

1 に答える 1

3

( http://fluentvalidation.codeplex.com/discussions/267990に相互投稿)

表示されているエラー メッセージは、FluentValidation からのものではありません。

"The value is not valid for CloseTime" は、FluentValidation が開始される前に生成される MVC エラー メッセージです。

これは、すべてのプロパティが設定されると、FluentValidation がオブジェクト全体を検証することによって機能するために発生しますが、あなたの場合、文字列「*ここに終了時刻を入力してください」は有効な DateTime ではないため、MVC は実際にプロパティを有効な日時に設定できません。となり、エラーが発生します。

于 2011-08-06T09:24:48.950 に答える