在FromQuery中使用Dictionary时,ASP.Net Core Web API ModelState未经验证

时间:2017-03-03 21:39:40

标签: asp.net-web-api .net-core

我有一个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,但这似乎也不对。

1 个答案:

答案 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;
    }
}

我希望它有所帮助。