2017-05-02 20 views
0

我想驗證我的webApi 2輸入對象列表。流利的驗證不工作列表對象

但它不驗證。 Modelstate始終設置爲true。

示例代碼:

public class A 
{ 
    public int Id { get; set; } 
    public string Name { get; set; } 
} 

public class ClassAValidator : AbstractValidator<A> 
{ 
    public classAValidator() 
    { 
     RuleSet("ClassA",()=>{ 
      RuleFor(x => x.Id).NotEmpty().WithMessage("The Idcan't be Empty or Zero"); 
      RuleFor(x => x.Name).NotEmpty().Length(10).WithMessage("Name Should be Six Char length"); 
     }); 
    } 
} 

注:我們需要的是精確的6個字符的字符串字段。

API:

[HttpPut] 
public async Task<IHttpActionResult> Put([FromBody] List<A> alist) 
{ 
    if(!ModelState.IsValid) throw new InvalidDataException(ModelState,"Data Validation Failed for Upload Class A"); 
    // Model State is Always true 
} 

任何人都能指出我錯過了什麼?

更新: 我試過如圖Should i create a new Type for Collection in FluentValidation?

,但仍然有同樣的問題。

解決更新:

問題是規則集的使用引起的驗證沒有得到觸發。在刪除「RuleSet」時,即使沒有定義List [A] Validator類,它也可以工作。

來自Jeremy Skinner的消息:第一個問題是你的規則被封裝在規則集中,所以他們永遠不會被執行。規則集是選擇加入的,而自動集成只調用不在規則集中的規則。

回答

0

問題是規則集的使用造成的驗證不GE觸發。在刪除「RuleSet」時,即使沒有定義List [A] Validator類,它也可以工作。

來自Jeremy Skinner的消息:第一個問題是你的規則被封裝在規則集中,所以他們永遠不會被執行。規則集是選擇加入的,而自動集成只調用不在規則集中的規則。

-1

看起來您需要包含在構造函數中的RuleSet,至少根據此示例。

https://www.exceptionnotfound.net/custom-validation-in-asp-net-web-api-with-fluentvalidation/

所有的
public class ClassAValidator : AbstractValidator<A> 
{ 
    Public ClassAValidator() 
    { 
     RuleSet("ClassA",()=>{ 
     RuleFor(x => x.Id).NotEmpty().WithMessage("The Id can't be Empty or Zero"); 
     RuleFor(x => x.Name).NotEmpty().Length(10).WithMessage("Name Should be Six Char length"); 
     }); 
    } 

} 
+0

對不起,忘了添加構造函數..是的,我其實 – RajGan

2

首先,ModelState.IsValid是一個ASP.NET MVC構建驗證(默認),該模型綁定正確完成。除非您在MVC配置中進行設置,否則與FluentValidation無關。

您需要確保驗證器被調用。要驗證的A列表,它的元素,你需要兩個驗證:一爲A類型,以及一個用於列表/收藏/的A的IEnumerable:

public class ClassAValidator : AbstractValidator<A> 
{ 
    public ClassAValidator() 
    { 
     RuleFor(x => x.Id).NotEmpty().WithMessage("Id can't be empty"); 
     RuleFor(x => x.Name).NotEmpty().Length(10).WithMessage("Name should have length 10"); 
    } 
} 

public class ClassACollectionValidator : AbstractValidator<IEnumerable<A>> 
{ 
    public ClassACollectionValidator() 
    { 
     RuleFor(x =>x).SetCollectionValidator(new ClassAValidator()); 
    } 
} 

然後,您可以驗證您的列表如下

[HttpPut] 
public async Task<IHttpActionResult> Put([FromBody] List<A> alist) 
{ 
    if(!ModelState.IsValid) throw new InvalidDataException(ModelState,"Data Validation Failed for Upload Class A"); 

    var validator = new ClassACollectionValidator(); 
    var result = validator.Validate(alist); 
} 

或者,可以按如下方式結合兩個驗證:

public class ClassACollectionValidator : AbstractValidator<IEnumerable<A>> 
{ 
    public ClassACollectionValidator() 
    { 
     RuleForEach(x => x.Id).NotEmpty().WithMessage("Id can't be empty"); 
     RuleForEach(x => x.Name).NotEmpty().Length(10).WithMessage("Name should have length 10"); 
    } 
} 
+0

感謝您的回覆使用Ruleset造成的問題.. – RajGan