2017-10-15 19 views
1

FluentValidationをテストするための簡単なコードを書き留めようとしている中級プログラマですが、手動でバリデーターを呼び出してその結果をModelState .AddToModelState検証にエラーがあると認識するためにModelState.IsValidを取得できません。どこかで統合が失われていますか?FluentValidationを使用している場合、ModelState.IsValidは常にtrueと評価されます

これは私のバリューモデルで、2つのプリセット値を持つ文字列配列です。

using FluentValidation.Attributes; 
using Playground2.Validators; 

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

} 

これは5〜10文字の2つの値を探しているバリデータです。

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は常に、trueとして評価しています。

+1

モデルバインディングを介して(要求)パラメータだけを見ると思います。 none( 'Get()')がないので、要求は有効です。 – Caramiriel

答えて

0

FluentValidationは、GETおよびPOSTに関してMVCの/ HTMLの規約に従います。この場合、ユーザが必ずしも何らかのアクションを実行したとは限らないため、ページの最初のGETのバリデーションが行われるとは期待していません。彼らは代わりに何かをやって開始にページを要求している - 彼らはデータを提供することに慣れていない。ユーザーが情報を記入したら

は慣例がHttpPostマークされたメソッドを介してコントローラにデータを提出する<button>または<input type="submit"/>使用してHTML <form>にデータを提出することです。この時点で検証が行われ、ModelState.IsValidを正確に調べることができます。

+0

ありがとうございます!だから私はちょうどテストのために適切な場所に持っていなかったので、ポストテストを設定する必要があります。 – OldKingKaiser

関連する問題