2017-03-03 8 views
0

私はいくつかのパラメータとクエリ内のDictionaryを受け付けるGETエンドポイントを持っています。ASP.Net Core Web API ModelStateは、DictionaryがFromQueryで使用されているときに無効化されます。

public IActionResult Get([FromQuery] RequiredFields required, [FromQuery] Dictionary<string, string> parameters) 

必須フィールドは、必要な既知のフィールドの型付きクラスです。 "paramaters"は、RequiredFieldsの値に基づいてオプションで必要となるオプションのパラメータの辞書です。たとえば、RequiredFields.TypeがFooと等しい場合、パラメータには "x"と "y"キーが含まれている必要があります。

問題は、ModelState.IsValidはエラーなしで常にfalseです。 ModelState.Rootを検査するとき、未検証の子は、Dictionary内のRequiredFieldsオブジェクトに存在しないキーです。

これはバグですか、または辞書のキーと値のペアを手動で検証する必要がありますか?

私はいくつか試みました。

1)カスタムValidationAttributeを追加しようとしましたが、何らかの理由で呼び出されませんでした。

2)IsValidではなくModelState.ErrorCount> 0が使用されましたが、それはどちらかと思われません。

答えて

0

WebApiではViewModelのようにModelBinderを作成し、カスタム検証にはIValidatableObjectインターフェイスを実装できます。

コードはテストされていません。

public class ResourceModelBinder : IValidatableObject 
{ 
    public RequiredFields RequiredFields { get; set; } 

    public Dictionary<string, string> Parameters { get; set; } 

    public IEnumerable<ValidationResult> Validate(ValidationContext validationContext) 
    { 
     var results = new List<ValidationResult>(); 
     if (RequiredFields.Type == "Foo") 
     { 
      if (string.IsNullOrEmpty(Parameters["x"]) || string.IsNullOrEmpty(Parameters("y"))) 
      { 
       results.Add(new ValidationResult("Parameters x and y are required.")); 
      } 
     } 
     return results; 
    } 
} 

私はそれが役に立ちそうです。

+1

私はこれを試しましたが、Dictionary にデシリアライズするパラメータクエリ文字列変数を渡すことができません。これはJSONデータを含むPOSTのように単純ですが、GETではカスタムのModelBinderを記述しない限り、サポートされていないようです。 –

関連する問題