创建webApi控制器时,传递的唯一参数是字符串,我可以应用验证器属性“必需'”或“'字符串长度'?
这对我来说似乎不起作用......
控制器操作示例:
[HttpPost]
[ActionName("GetInventoryDetails")]
public HttpResponseMessage GetInventoryDetails([FromBody][Required][StringLength(20)]string serialNumber)
{
if (ModelState.IsValid == true)
{
var response = Request.CreateResponse(statusCode: HttpStatusCode.OK, value: string.Empty, mediaType: Request.Content.Headers.ContentType);
return response;
}
else
{
var response = Request.CreateResponse(statusCode: HttpStatusCode.BadRequest);
return response;
}
}
当我传入一个长度超过20个字符的字符串时,ModelState.IsValid为true。另外,如果我传递没有参数ModelState.IsValid也是如此。在这两种情况下,我都希望ModelState.IsValid
是假的。
顺便说一下 - 如果相反我构造一个控制器动作来接受一个对象而不是一个字符串,如果我将属性验证器放在该类的属性上,那么验证按预期工作,ModelState.IsValid
显示为假。只有当我尝试使用内联属性验证器时,ModelState.IsValid
才会显示意外结果。
答案 0 :(得分:3)
你回答了自己的问题,因为它不起作用。 但是,属性用法定义为
[AttributeUsageAttribute(AttributeTargets.Property | AttributeTargets.Field | AttributeTargets.Parameter, AllowMultiple = false)]
由于允许参数,它似乎可以工作,但显然不是。 现在,您可以创建自己的操作属性,然后可以从中强制执行验证。
答案 1 :(得分:1)
我怀疑问题出在您的HTTP请求中。如果您正在接受对象或单个字符串参数,则需要对请求进行略微不同的格式化。
如果您接受一个对象(您说的方式有效),那么您的请求正文将是一个JSON对象,其中包含一个名为serialNumber
的属性:
{ serialNumber: "serial1234" }
但是,如果只接受一个字符串参数,那么according to the documentation,请求的正文应该是"原始JSON字符串(不是JSON对象)"。所以看起来应该是这样的:
"serial1234"
仅当您的请求中的Content-Type为" application / json"时才需要引号。如果您将其发送为" text / plain",那么您可能不需要引号。