C# 为什么fluent.validate在asp.net mvc中引发异常

C# 为什么fluent.validate在asp.net mvc中引发异常,c#,asp.net-mvc,fluentvalidation,C#,Asp.net Mvc,Fluentvalidation,我想在发布表单时覆盖默认的asp.net-mvc验证 我创建了一个验证器类(ProjectValidator) 我把它放在应用程序_start()中 但是,当我发布使用此对象的表单时,会出现以下错误: 找不到方法:“System.Collections.Generic.IEnumerable`1 FluentValidation.IValidatorDescriptor.GetValidatorsFormMember(System.String)” 有什么建议吗?这可能是与您使用的程序集版本有关

我想在发布表单时覆盖默认的asp.net-mvc验证

我创建了一个验证器类(ProjectValidator)

我把它放在应用程序_start()中

但是,当我发布使用此对象的表单时,会出现以下错误:

找不到方法:“System.Collections.Generic.IEnumerable`1 FluentValidation.IValidatorDescriptor.GetValidatorsFormMember(System.String)”


有什么建议吗?

这可能是与您使用的程序集版本有关的问题。以下是使用最新版本的FluentValidation.NET和ASP.NET MVC 3的步骤:

  • 使用默认的Visual Studio模板创建新的ASP.NET MVC 3项目
  • 安装
    FluentValidation.MVC3
    NuGet软件包
  • 添加视图模型及其相应的验证器(请注意,在您的示例中,类型为Project-
    AbstractValidator
    的验证器,而视图模型名为
    ProjectViewModel
    ,这是不一致的。验证器必须与视图模型相关联):

  • 定义控制器:

    public class HomeController : Controller
    {
        public ActionResult Index()
        {
            return View(new ProjectViewModel());
        }
    
        [HttpPost]
        public ActionResult Index(ProjectViewModel model)
        {
            return View(model);
        }
    }
    
  • 还有一个观点:

    @model Appame.Models.ProjectViewModel
    
    @using (Html.BeginForm())
    {
        <div>
            @Html.LabelFor(x => x.Application)
            @Html.EditorFor(x => x.Application)
            @Html.ValidationMessageFor(x => x.Application)
        </div>
        <div>
            @Html.LabelFor(x => x.FundingType)
            @Html.EditorFor(x => x.FundingType)
            @Html.ValidationMessageFor(x => x.FundingType)
        </div>
        <div>
            @Html.LabelFor(x => x.Description)
            @Html.EditorFor(x => x.Description)
            @Html.ValidationMessageFor(x => x.Description)
        </div>
        <div>
            @Html.LabelFor(x => x.Name)
            @Html.EditorFor(x => x.Name)
            @Html.ValidationMessageFor(x => x.Name)
        </div>
    
        <input type="submit" value="OK" />
    }
    
    @model Appame.Models.ProjectViewModel
    @使用(Html.BeginForm())
    {
    @LabelFor(x=>x.Application)
    @EditorFor(x=>x.Application)
    @Html.ValidationMessageFor(x=>x.Application)
    @LabelFor(x=>x.FundingType)
    @EditorFor(x=>x.FundingType)
    @Html.ValidationMessageFor(x=>x.FundingType)
    @LabelFor(x=>x.Description)
    @EditorFor(x=>x.Description)
    @Html.ValidationMessageFor(x=>x.Description)
    @LabelFor(x=>x.Name)
    @EditorFor(x=>x.Name)
    @Html.ValidationMessageFor(x=>x.Name)
    }
    
  •  DataAnnotationsModelValidatorProvider
                .AddImplicitRequiredAttributeForValueTypes = false;
    
     ModelValidatorProviders.Providers.Add(
                new FluentValidationModelValidatorProvider(new AttributedValidatorFactory()));
    
    public class ProjectValidator : AbstractValidator<ProjectViewModel>
    {
        public ProjectValidator()
        {
            RuleFor(h => h.Application).NotNull().WithName("Application");
            RuleFor(h => h.FundingType).NotNull().WithName("Funding Type");
            RuleFor(h => h.Description).NotEmpty().WithName("Description");
            RuleFor(h => h.Name).NotEmpty().WithName("Project Name");
        }
    }
    
    [Validator(typeof(ProjectValidator))]
    public class ProjectViewModel
    {
        public string Application { get; set; }
        public string FundingType { get; set; }
        public string Description { get; set; }
        public string Name { get; set; }
    }
    
    protected void Application_Start()
    {
        AreaRegistration.RegisterAllAreas();
    
        RegisterGlobalFilters(GlobalFilters.Filters);
        RegisterRoutes(RouteTable.Routes);
    
        DataAnnotationsModelValidatorProvider.AddImplicitRequiredAttributeForValueTypes = false;
        ModelValidatorProviders.Providers.Add(new FluentValidationModelValidatorProvider(new AttributedValidatorFactory()));
    }
    
    public class HomeController : Controller
    {
        public ActionResult Index()
        {
            return View(new ProjectViewModel());
        }
    
        [HttpPost]
        public ActionResult Index(ProjectViewModel model)
        {
            return View(model);
        }
    }
    
    @model Appame.Models.ProjectViewModel
    
    @using (Html.BeginForm())
    {
        <div>
            @Html.LabelFor(x => x.Application)
            @Html.EditorFor(x => x.Application)
            @Html.ValidationMessageFor(x => x.Application)
        </div>
        <div>
            @Html.LabelFor(x => x.FundingType)
            @Html.EditorFor(x => x.FundingType)
            @Html.ValidationMessageFor(x => x.FundingType)
        </div>
        <div>
            @Html.LabelFor(x => x.Description)
            @Html.EditorFor(x => x.Description)
            @Html.ValidationMessageFor(x => x.Description)
        </div>
        <div>
            @Html.LabelFor(x => x.Name)
            @Html.EditorFor(x => x.Name)
            @Html.ValidationMessageFor(x => x.Name)
        </div>
    
        <input type="submit" value="OK" />
    }