我有一个GET端点,它在查询中接受一些参数和一个字典。
public IActionResult Get([FromQuery] RequiredFields required, [FromQuery] Dictionary<string, string> parameters)
RequiredFields是必需的已知字段的类型类。 &#34; PARAMATERS&#34;是可选参数的字典,根据RequiredFields中的值可选地需要这些参数。例如,如果RequiredFields.Type等于Foo,则参数必须包含&#34; x&#34;和&#34; y&#34;密钥。
问题是ModelState.IsValid始终为false且没有错误。当我检查ModelState.Root时,未经验证的子项是Dictionary中的键,它们不在RequiredFields对象中。
这是一个错误还是我需要做些什么来手动验证字典中的键值和值对?
我试过的一些事情。
1)我尝试添加自定义ValidationAttribute,但由于某种原因没有调用。
2)我最终使用了ModelState.ErrorCount&gt; 0而不是IsValid,但这似乎也不对。
答案 0 :(得分: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;
}
}
我希望它有所帮助。