是否允许使用内联属性验证程序?

时间:2018-04-05 16:20:13

标签: c# asp.net-mvc validation asp.net-web-api modelstate

创建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才会显示意外结果。

2 个答案:

答案 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",那么您可能不需要引号。