2017-03-03 28 views
0

我有一个GET端点,它接受查询中的几个参数和一个字典。当在FromQuery中使用字典时,ASP.Net核心Web API ModelState未验证

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

RequiredFields是需要的已知字段的类型化类。 “参数”是可选参数的字典,可选参数根据RequiredFields中的值进行选择。例如,如果RequiredFields.Type等于Foo,那么参数必须包含“x”和“y”键。

问题是ModelState.IsValid始终为false,没有错误。当我检查ModelState.Root时,未验证的子项是Dictionary中不存在于RequiredFields对象中的键。

这是一个错误还是有我需要做的手动验证字典中的键和值对?

我试过的一些东西。

1)我试着添加一个自定义的ValidationAttribute,但没有因为某种原因而被调用。

2)我结束了使用ModelState.ErrorCount> 0而不是IsValid,但似乎并不正确。

回答

0

您可以创建一个ModelBinder,如ViewModel,但用于WebApi,并实现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

我试过了,我似乎无法传入参数查询字符串变量,该变量反序列化为字典<字符串,字符串>。这很简单,因为带有JSON数据的POST很简单,但对于GET,除非我编写自定义的ModelBinder,否则它似乎不受支持。 –

相关问题