【问题标题】:Web API: QueryString model binding rules with DataAnnotationsWeb API:使用 DataAnnotations 的 QueryString 模型绑定规则
【发布时间】: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


【解决方案1】:

您描述的问题是(曾经)是最近才解决的 ASP.NET WebApi 中的一个错误。您可以在http://aspnetwebstack.codeplex.com/workitem/1471找到详细信息。

对于您的字符串属性,您应该能够使用 [Required],但添加参数 AllowEmptyStrings=false。我只需要非字符串属性的解决方法(如错误报告开发人员所述)。

如果您使用 JSON 进行反序列化,您可能希望将您的 int 属性设为可空 (int?);没有使它成为int? Newtonsoft.Json 将属性的空字符串转换为 0。

/SearchRequest?SearchPath=[some string]&SearchValue=[some string]&SortBy=[some string]&Limit=

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-01-30
    • 1970-01-01
    • 2012-08-28
    • 1970-01-01
    • 1970-01-01
    • 2016-12-21
    • 1970-01-01
    相关资源
    最近更新 更多