2017-10-15 37 views
1

我是一名初級程序員,嘗試編寫一小段代碼來測試FluentValidation,但沒有手動調用驗證程序並使用.AddToModelState將結果添加到模型狀態,我無法使ModelState.IsValid識別驗證中存在錯誤。我在某處丟失集成嗎?ModelState.IsValid在使用FluentValidation時總是評估爲true

這是我的價值模型,只是一個具有兩個預設值的字符串數組。

using FluentValidation.Attributes; 
using Playground2.Validators; 

namespace Playground2.Models 
{ 
    [Validator(typeof(ValueValidator))] 
    public class Value 
    { 
     public string[] values = { "value1", "" }; 
    } 

} 

這是我的驗證器,查找5到10個字符之間的兩個值。

using FluentValidation; 
using Playground2.Models; 

namespace Playground2.Validators 
{ 
    public class ValueValidator : AbstractValidator<Value> 
    { 
     public ValueValidator() 
     { 
      RuleFor(x => x.values[0]).Length(5, 10); 
      RuleFor(x => x.values[1]).Length(5, 10); 
     } 
    } 
} 

在ValuesController中,我只是簡單地創建一個值對象並運行檢查以查看它是否在輸出前通過驗證。

using FluentValidation.AspNetCore; 
using Microsoft.AspNetCore.Mvc; 
using Playground2.Models; 
using System.Collections.Generic; 

namespace Playground2.Controllers 
{ 
    [Route("api/[controller]")] 
    public class ValuesController : Controller 
    { 
     // GET api/values 
     [HttpGet] 
     public IEnumerable<string> Get() 
     { 
      var value = new Value(); 

      if (!ModelState.IsValid) 
      { 
       return new string[] { "Not valid" };  
      } 
      else 
      { 
       return value.values; 
      }   
    } 

但在運行時,該ModelState.IsValid一直在評估爲真,但送入值的信息是默認無效。

+1

我想它只會通過模型綁定來查看(請求)參數。由於沒有('Get()'),請求是有效的。 – Caramiriel

回答

0

FluentValidation遵循關於GET s和POST s的MVC/HTML約定。在這種情況下,由於用戶不一定會執行任何操作,因此不會期望任何驗證都將在頁面的初始頁面GET中完成。他們正在請求頁面開始做一些事情 - 他們還沒有到處提供數據。

一旦用戶填寫信息的慣例是使用<button><input type="submit"/>經由HttpPost標記方法中的數據提交到所述控制器在HTML <form>提交數據。此時驗證已觸發,您將能夠正確詢問ModelState.IsValid

+0

非常感謝!所以我只是沒有把它放在正確的地方進行測試,還得努力設置一個測試後測試。 – OldKingKaiser