【发布时间】:2013-05-19 16:15:16
【问题描述】:
我对模型绑定,特别是模型验证如何在 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 请求进行模型验证时没有这个问题,并且不完全理解为什么当模型通过查询字符串来时它的行为会有所不同。
有人可以解释一下吗?我想了解如何验证传入查询字符串的参数 - 我认为除了在操作正文中执行验证之外还有其他方法。
我阅读了文章here,但它并没有真正解释当模型进入查询字符串时模型验证如何或为什么会有所不同。
【问题讨论】:
-
旧帖子,但对于偶然发现它的其他人。看来这是一个最近才解决的错误; Bug details
-
哦,真的吗?你在任何地方都有错误报告或解释的链接吗?
-
这篇文章在我的评论中有链接,但不是很突出。这是:http://aspnetwebstack.codeplex.com/workitem/1471
-
很好,很高兴得到这个答案,因为我当时真的很困惑!如果你想把它作为这个问题的答案,我会把它标记为正确的。
标签: query-string model-binding asp.net-web-api model-validation