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; }
.....
}
这是我想要的:
当发送
GET /api/products?number=Test1234567
时,它将返回编号为"Test1234567"的产品信息当发送
GET /api/products?number=
时,它将返回错误,因为空字符串与正则表达式不匹配当发送
GET /api/products
时,它将返回所有产品的信息
因此,你能建议我使用Validation Attribute来实现这一点吗?因为我们有一个通用的方法来处理ValidationException
,并且我们不能从方法GetProducts
中抛出ValidationException
。我曾尝试在Number
上使用[Required]
和[DisplayFormat(ConvertEmptyStringToNull = false)]
,但都不起作用。
如果不可能,也请通知我。
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或空输入,所以您的问题是完全不同的。