是否允许内联属性验证器?

Are inline attribute validators allowed?

创建 webApi 控制器时,传递的唯一参数是字符串,我可以为 'Required' 或 'String Length' 应用验证器属性吗?

这似乎对我不起作用...

控制器动作示例:

[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 为真。另外,如果我没有传递参数 ModelState.IsValid 也是如此。在这两种情况下,我都期望 ModelState.IsValid 是错误的。

顺便说一句 - 如果我构造一个控制器操作来接受对象而不是字符串,并且如果我将属性验证器放在 class 的属性上,那么验证会按预期工作,并且 ModelState.IsValid显示错误。只有在我上面的示例中尝试使用内联属性验证器时,ModelState.IsValid 才会显示意外结果。

您回答了您自己的问题,因为它不起作用。 但是,属性用法定义为

[AttributeUsageAttribute(AttributeTargets.Property | AttributeTargets.Field | AttributeTargets.Parameter, AllowMultiple = false)]

既然参数是允许的,那么它似乎可以工作但显然不行。 现在您可以创建自己的操作属性,然后可以从中强制执行验证。

我怀疑问题出在您的 HTTP 请求中。如果您接受对象或单个字符串参数,请求的格式需要略有不同。

如果您接受一个对象(按照您所说的方式),那么您的请求主体将是一个 JSON 对象,其中包含一个名为 serialNumber 的 属性:

{ serialNumber: "serial1234" }

但是,如果您只接受一个字符串参数,那么 according to the documentation,您的请求正文应该是 "a raw JSON string (not a JSON object)"。所以它应该看起来像这样:

"serial1234"

仅当您请求的 Content-Type 为 "application/json" 时才需要引号。如果您将其作为 "text/plain" 发送,那么您可能不需要引号。