2017-10-15 6 views
1

저는 FluentValidation을 테스트하기 위해 간단한 코드를 작성하려고 노력하는 주니어 프로그래머이지만 수동으로 유효성 검사기를 호출하고 결과를 .AddToModelState, 유효성 검사에 오류가 있음을 인식하도록 ModelState.IsValid를 가져올 수 없습니다. 어딘가에 통합이 누락 되었습니까?FluentValidation으로 작업 할 때 ModelState.IsValid는 항상 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은 GETPOST과 관련하여 MVC의/HTML 규칙을 따릅니다. 이 경우 사용자가 반드시 어떤 작업을 수행하지 않았으므로 페이지의 초기 GET에 대한 유효성 검사가 필요하지는 않습니다. 그들은 대신 페이지를 으로 시작하여을 시작하려고합니다. 그들은 데이터를 제공하지 않았습니다. 사용자가 정보를 채워지면

협약은 HttpPost 표시된 방법을 통해 제어기로 데이터를 전송하는 <button> 또는 <input type="submit"/> 이용한 HTML <form>에서 데이터를 전송하는 것이다. 이 시점에서 유효성 검사가 실행되고 ModelState.IsValid을 올바르게 질의 할 수 있습니다.

+0

대단히 감사합니다! 그래서 나는 테스트를 위해 올바른 곳에서 테스트를하지 않았고 포스트 테스트를 설정해야했습니다. – OldKingKaiser