2011-03-21 171 views
1

我遵循了所有在本教程下列步驟來:基於屬性的驗證似乎不使用asp.net-MVC

創建一個驗證器類

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具體這個validtor

[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

enter image description here

看看我直接在代碼中調用驗證它工作得很好:

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

回答

1

我不知道是什麼類型的HTML元素FundingTypeId是,但我假設它是一個下拉列表。如果沒有選擇,那麼它會給你這個錯誤。這不幸是MVC與MVC集成的限制之一,這是由MVC的默認模型綁定器的糟糕設計引起的。該消息不是由FV生成的,而是由DefaultModelBinder生成的,在這種情況下,傳入值不能轉換爲屬性類型。

退房,我貼在了流利的驗證論壇這2個問題: http://fluentvalidation.codeplex.com/discussions/250798 http://fluentvalidation.codeplex.com/discussions/253389