2011-03-21 24 views
0

我想重寫默認asp.net MVC的驗證提交表單so i tried using fluent.validation爲什麼fluent.validate扔在asp.net mvc的異常

當我創建了一個驗證器類(ProjectValidator)

public class ProjectValidator : AbstractValidator<Project> 
{ 
    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 
    { 
     ... 
    } 

,我把這個在的Application_Start();

DataAnnotationsModelValidatorProvider 
      .AddImplicitRequiredAttributeForValueTypes = false; 

ModelValidatorProviders.Providers.Add(
      new FluentValidationModelValidatorProvider(new AttributedValidatorFactory())); 

但是當我發佈使用這個對象,我得到以下錯誤的一種形式:

Method not found: 'System.Collections.Generic.IEnumerable`1 FluentValidation.IValidatorDescriptor.GetValidatorsForMember(System.String)'.

有什麼建議?

回答

2

這可能是與您正在使用的程序集版本相關的問題。下面是我用FluentValidation.NET和ASP.NET MVC 3的最新版本的工作步驟:

  1. 創建使用默認的Visual Studio模板創建一個新的ASP.NET MVC 3項目。
  2. 安裝FluentValidation.MVC3 NuGet包。
  3. 添加視圖模型和相應的驗證(請注意,你的情況,你有型項目驗證 - AbstractValidator<Project>而您的視圖模型被稱爲ProjectViewModel這是不一致的驗證器必須關聯到視圖模型) :

    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; } 
    } 
    
  4. Application_Start註冊驗證:

    protected void Application_Start() 
    { 
        AreaRegistration.RegisterAllAreas(); 
    
        RegisterGlobalFilters(GlobalFilters.Filters); 
        RegisterRoutes(RouteTable.Routes); 
    
        DataAnnotationsModelValidatorProvider.AddImplicitRequiredAttributeForValueTypes = false; 
        ModelValidatorProviders.Providers.Add(new FluentValidationModelValidatorProvider(new AttributedValidatorFactory())); 
    } 
    
  5. 定義的控制器:

    public class HomeController : Controller 
    { 
        public ActionResult Index() 
        { 
         return View(new ProjectViewModel()); 
        } 
    
        [HttpPost] 
        public ActionResult Index(ProjectViewModel model) 
        { 
         return View(model); 
        } 
    } 
    
  6. 和一個視圖:

    @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" /> 
    }