我对模型绑定,特别是模型验证如何在 Web API 中发生感到非常困惑。我的大部分操作都通过 POST 请求接收对象,并且我的模型应用了各种 ValidationAttributes,例如 RequiredAttribute、MinLengthAttribute、StringLengthAttribute 等。
但是,我的一项操作是 GET 请求,并且具有类似于以下的签名:
public SearchResultCollection Search([FromUri]SearchRequest request)
最初,它看起来像下面这样,但后来我发现您可以创建一个类来封装查询字符串中的参数:
public SearchResultCollection Search(string searchPath, string searchValue, int limit, string sortBy)
使用后者,我无法对参数进行任何形式的验证。例如,将 RequiredAttribute 应用于 searchPath 参数似乎什么也没做。这促使了对操作签名的更改,并创建了 SearchRequest 类,如下所示:
public class SearchRequest
{
public SearchRequest()
{
SortBy = SearchSortingKey.Id;
}
[Required(ErrorMessage="A search path must be specified.")]
public string SearchPath{ get; set; }
[Required(ErrorMessage="A search value must be specified.")]
public string SearchValue{ get; set; }
[Required(ErrorMessage="A limit be specified.")]
public int Limit { get; set; }
public SearchSortingKey SortBy { get; set; }
}
使用这种方法,似乎RequiredAttributes 被识别(它们导致模型验证失败),但执行模型验证时返回的错误消息不是我在上面RequiredAttributes 中指定的错误消息。
在使用 POST 请求进行模型验证时,我没有这个问题,并且不完全理解为什么当模型通过查询字符串出现时它的行为会有所不同。
有人可以对此有所了解吗?我想了解如何验证在查询字符串中传入的参数 - 我认为除了在操作正文中执行验证之外还有其他方法。
我在这里阅读了这篇文章,但它并没有真正解释当模型进入查询字符串时模型验证如何或为什么会有所不同。