繁体   English   中英

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

[英]ASP.NET WebAPI 2: handle empty string query parameters

我们有一个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)] ,但是它们都不起作用。

如果无法实现,也请通知我。

编辑:我认为您的问题是您没有传递完整的模型作为参数-一旦活页夹试图绑定查询字符串,您将为null 这不是您的正则表达式的问题。 要使其正常工作,您应该发出q请求,例如GET /api/products?number=&prop1=some_value&prop2=some_value


原始答案:

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

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;
    }

如您所见,它允许输入空值或空值,因此您的问题就大不一样了。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM