1

このチュートリアルでは、次のすべての手順に従いました。

バリデータークラスを作成しました

public class ProjectValidator : AbstractValidator<ProjectViewModel>
{
    public ProjectValidator()
    {
        //RuleFor(h => h.Milestone).NotEmpty().WithName("Milestone");
        RuleFor(h => h.Applications).NotNull().WithName("Application");
        RuleFor(h => h.InitiativeName).NotNull().WithName("Business Aligned Priority");
        RuleFor(h => h.BusinessDriverId).NotNull().WithName("Business Driver");
        RuleFor(h => h.FundingTypeId).NotNull().WithName("Funding Type");
        RuleFor(h => h.Description).NotEmpty().WithName("Description");
        RuleFor(h => h.Name).NotEmpty().WithName("Project Name");
        RuleFor(h => h.Sponsors).NotNull().WithName("Sponsors");
    }
}

このバリデーターを特定するために、DTOに属性を設定します

[Validator(typeof(ProjectValidator))]
public class ProjectViewModel
{
}

しかし、フォームの投稿後、ModelStateエラーリストを確認すると、表示されるエラーはasp.net-mvcのデフォルトの検証から発生しています。

 public ActionResult UpdateMe(ProjectViewModel entity)
    {
        Project existingProject = this.Repository.Fetch<Project>(entity.Id);

        UpdateProperties(entity, existingProject);
        var allErrors = ModelState.Values.SelectMany(v => v.Errors);
        if (allErrors.Count() > 0)
        {

なぜ流暢に話せないのかについての提案。バリデーター?? GUIで見たものの画像を下に追加しました

ここに画像の説明を入力してください

コードでバリデーターを直接呼び出すと、問題なく機能します。

 ProjectValidator validator = new ProjectValidator();
 ValidationResult result = validator.Validate(entity);
4

1 に答える 1

3

HTML要素FundingTypeIdのタイプはわかりませんが、ドロップダウンリストであると想定しています。何も選択されていない場合は、このエラーが発生します。残念ながら、これはMVCとのFV統合の制限の1つであり、MVCのデフォルトモデルバインダーの設計が不適切なために発生します。このメッセージはFVによって生成されるのではなく、DefaultModelBinderによって生成されます。この場合、着信値をプロパティタイプに変換することはできません。

Fluent Validationディスカッションフォーラムに投稿した次の2つの質問を確認してください:http: //fluentvalidation.codeplex.com/discussions/250798 http://fluentvalidation.codeplex.com/discussions/253389

于 2011-04-20T12:19:29.080 に答える