ASP.NET WebAPI 2:处理空字符串查询参数

本文关键字:字符串 查询 参数 处理 NET WebAPI ASP | 更新日期: 2023-09-27 18:29:29

我们有一个用于获取产品数据的api:

public IHttpActionResult GetProducts(ProductFilter productFilter)
{
    try
    {
        .....
    }
    catch(Exception)
    {
        throw new OurCustomException();
    }
}

public class ProductFilter
{
    [RegularExpression(@"^[a-zA-Z0-9]{11}$")]
    public String Number { get; set; }
    .....
}

这是我想要的:

  1. 当发送GET /api/products?number=Test1234567时,它将返回编号为"Test1234567"的产品信息

  2. 当发送GET /api/products?number=时,它将返回错误,因为空字符串与正则表达式不匹配

  3. 当发送GET /api/products时,它将返回所有产品的信息

因此,你能建议我使用Validation Attribute来实现这一点吗?因为我们有一个通用的方法来处理ValidationException,并且我们不能从方法GetProducts中抛出ValidationException。我曾尝试在Number上使用[Required][DisplayFormat(ConvertEmptyStringToNull = false)],但都不起作用。

如果不可能,也请通知我。

ASP.NET WebAPI 2:处理空字符串查询参数

EDIT:我认为您的问题是您没有将完整的模型作为参数传递——一旦绑定器尝试绑定查询字符串,您就会得到null。这不是正则表达式的问题。为了让它发挥作用,你应该像GET /api/products?number=&prop1=some_value&prop2=some_value 一样提出q请求


原始答案:

我认为将正则表达式更改为:

public class ProductFilter
{
    [RegularExpression(@"^(|[a-zA-Z0-9]{11})$")]
    public String Number { get; set; }
    .....
}

应该做一个把戏。

但是MSDN文档指出:

如果属性的值为null或空字符串("),则值自动通过RegularExpressionAttribute属性。

所以它无论如何都应该起作用。此外,我们还可以检查RegularExpression代码:

    public override bool IsValid(object value)
    {
      this.SetupRegex();
      string input = Convert.ToString(value, (IFormatProvider) CultureInfo.CurrentCulture);
      if (string.IsNullOrEmpty(input))
        return true;
      Match match = this.Regex.Match(input);
      if (match.Success && match.Index == 0)
        return match.Length == input.Length;
      return false;
    }

正如您所看到的,它允许null或空输入,所以您的问题是完全不同的。