2016-05-05 4 views
3

私はテストを試みて同じ結果を得るためにfiddlerとswaggerを使用しました。ここでaspnet 5 RESTful API ModelState.IsValid == DataAnnotationsで値が無効であってもtrueです。

はモデルです:

using System.ComponentModel.DataAnnotations; 
namespace AdGeo.Configuration.WebApi.Model 
{ 
    public class ValueAdd 
    { 
     public string test { get; set; } 
     [Required(ErrorMessage = "Range is required")] 
     [Range(0,9,ErrorMessage ="Range 0 to 9")] 
     [Display(Name ="Test Required")] 
     public int? testrequired { get; set; } 
    } 
} 

ここでコントローラです:

using Microsoft.AspNet.Mvc; 
using AdGeo.Configuration.WebApi.Model; 

// For more information on enabling Web API for empty projects, visit http://go.microsoft.com/fwlink/?LinkID=397860 

namespace AdGeo.Configuration.WebApi.Controllers 
{ 
    [Route("api/[controller]")] 
    public class ValuesController : Controller 
    { 
     // GET api/values/5 
     [HttpGet("{id}")] 
     public string Get(int id) 
     { 
      return "value"; 
     } 

     // POST api/values 
     [HttpPost] 
     public IActionResult Post([FromBody]ValueAdd valueAdd) 
     { 
      if(ModelState.IsValid) 
      { 
       return new CreatedAtActionResult("Get", "Values", new { id = 5 }, valueAdd); 
      } 
      return new BadRequestObjectResult(ModelState); 
     } 
    } 
} 

サンプルJSON:

{ 
    "test": "string", 
    "testrequired": 100 
} 

それは本当等しいModelState.IsValidになり、私は100が範囲外であるため、それが偽と等しくなることを期待しています。私は、このJSONを投稿しようとした場合

はまた、: サンプルJSON:

{ 
    "test": "string" 
} 

を私はModelState.IsValidが偽であることを期待する、しかしそれは本当等しいです。

アクションフィルタを作成しようとしている人は、私が見ているところはほとんどありませんが、MVC6の前のソリューションと同じではありません。

私は何が不足していますか、これはStackExchangeの最初の投稿であることに注意してください。明確化が必要なことを私に教えてください。私はそれに応じて編集します。

ありがとうございました!

+0

モデルの状態のエラーを確認しましたか? 'var errors = ModelState.Where(e => e.Value.Errors.Count> 0).ToList();'で取得できます。 –

+0

質問していただきありがとうございます。問題は、ModelStateにエラーがないとは思わないことです。私があなたが求めているものを誤って解釈していない限り、ModelState.IsValidの戻り値は真実です。ちょうど私があなたが提案したものを実行しようとしましたが、ModelStateのメソッドはどこにありませんでした。 –

+0

ハァッ、そうですよ!私はあなたの質問を誤解しました。私が現時点で持っている唯一の提案は、HttpPostメソッドにブレークポイントを設定し、 'valueAdd'の値をピークにして、期待通りのものかどうかを確認することです。 –

答えて

0

私はそれがAddMvcではなくAddMvcCoreを使用しているからだと思います。それを解決するために、私は次のアクションフィルタ属性を作成しました。モデルがnullであり、必須であるかどうかをチェックし、nullでない場合は検証を実行します。

/// <summary> 
/// Validate inputs and update ModelState with errors 
/// </summary> 
public class ValidateModelAttribute : ActionFilterAttribute 
{ 
    public override void OnActionExecuting(ActionExecutingContext context) 
    { 
     var parameters = context.ActionDescriptor.Parameters.Cast<ControllerParameterDescriptor>().ToDictionary(p => p.Name); 

     foreach (var kvp in context.ActionArguments) 
     { 
      if (kvp.Value == null) 
      { 
       if (!parameters[kvp.Key].ParameterInfo.IsOptional) 
       { 
        context.ModelState.AddModelError($"{kvp.Key}", "Parameter is required"); 
       } 

       continue; 
      } 

      var results = new List<ValidationResult>(); 
      var vc = new ValidationContext(kvp.Value); 
      if (!Validator.TryValidateObject(kvp.Value, vc, results)) 
      { 
       var errs = from vr in results 
          from member in vr.MemberNames 
          select new { Member = member, vr.ErrorMessage }; 

       foreach (var err in errs) 
       { 
        context.ModelState.AddModelError($"{kvp.Key}.{err.Member}", err.ErrorMessage); 
       } 
      } 
     } 
    } 
} 
関連する問題