我们正在使用ASP.NET MVC Web API,.NET 4开发Web API,我们正在使用JSON.NET v 6.0.0.0
如果我向我们的API提交请求,例如:
/ API /产品/查找productIdList =安培; productIdList =安培; productIdList =
,请求模型定义为
[JsonObject]
public class ProductLookupRequest
{
[Required(ErrorMessage = "productIdList is a required parameter.")]
[MinLength(1, ErrorMessage = "A minimum of one (1) product Id must be specified.")]
[MaxLength(50, ErrorMessage = "A maximum of twenty (20) product Ids can be specified.")]
public int[] ProductIdList { get; set; }
}
并且处理请求的操作方法具有以下签名
[HttpGet]
[ValidateRequestModel]
public HttpResponseMessage ProductLookup([FromUri]ProductLookupRequest productLookupRequest)
控制器操作接收的ProductLookupRequest对象具有ProductIdList,其中填充了3个条目,每个条目的值为0.
目前我们在action方法中处理零值条目,如果数组包含任何零,则输出HTTP 400 Bad Request。
ValidateRequestModelAttribute检查模型状态,如果发现错误,则返回HTTP 400 Bad Request而不输入action方法。我想对没有值发送的查询字符串参数保持这种方法,这样我们就不会在控制器的操作方法中执行额外的验证。
问题: 是否有一些内置的方式来处理这个模型绑定或通过JSON.NET?或者我是否需要创建自定义数据注释来处理此问题;一个检查查询字符串参数,如果有空参数,会向ModelState添加一个错误,使其无效吗?
答案 0 :(得分:1)
您可以为此编写自定义验证属性并使用它来装饰ProductIdList:
public class NoNullsAttribute : ValidationAttribute
{
protected override ValidationResult IsValid(object value, ValidationContext validationContext)
{
int[] values = value as int[];
if (values != null)
{
foreach (int val in values)
{
if (val == 0)
{
return new ValidationResult("zero detected");
}
}
}
return ValidationResult.Success;
}
}