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

时间:2016-01-08 19:21:38

标签: c# asp.net asp.net-web-api2

我们有一个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时,它会返回所有产品的信息

  4. 所以你可以建议我使用Validation Attribute来做任何方法,因为我们有一个处理ValidationException的常用方法,我们不能从方法ValidationException中抛出GetProducts。我尝试在[Required]上使用[DisplayFormat(ConvertEmptyStringToNull = false)]Number,但没有一个有效。

    如果不可能,请告诉我。

1 个答案:

答案 0 :(得分:0)

编辑:我认为您的问题是您没有将完整模型作为参数传递 - 一旦binder尝试绑定查询字符串,您就会获得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;
    }

如您所见,它允许空或空输入,因此您的问题会有所不同。