1

我对模型绑定,特别是模型验证如何在 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 请求进行模型验证时,我没有这个问题,并且不完全理解为什么当模型通过查询字符串出现时它的行为会有所不同。

有人可以对此有所了解吗?我想了解如何验证在查询字符串中传入的参数 - 我认为除了在操作正文中执行验证之外还有其他方法。

我在这里阅读了这篇文章,但它并没有真正解释当模型进入查询字符串时模型验证如何或为什么会有所不同。

4

1 回答 1

1

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

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

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

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

于 2014-04-02T00:07:14.683 回答