我们有一个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
的常用方法,我们不能从方法ValidationException
中抛出GetProducts
。我尝试在[Required]
上使用[DisplayFormat(ConvertEmptyStringToNull = false)]
和Number
,但没有一个有效。
如果不可能,请告诉我。
答案 0 :(得分:0)
编辑:我认为您的问题是您没有将完整模型作为参数传递 - 一旦binder尝试绑定查询字符串,您就会获得null
。这不是你的正则表达式的问题。为了使其正常工作,您应该像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;
}
如您所见,它允许空或空输入,因此您的问题会有所不同。