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

C# 是否允许内联属性验证器?,c#,asp.net-mvc,validation,asp.net-web-api,modelstate,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.IsV

当创建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也是true。在这两种情况下,我都希望
ModelState.IsValid
为false


顺便说一句,如果我构造了一个控制器动作来接受一个对象而不是一个字符串,并且如果我在类的属性上放置了属性验证器,那么验证工作就像预期的那样,并且
ModelState.IsValid
显示false。只有在尝试内联使用属性验证器时,
ModelState.IsValid
才会显示意外结果。

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

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

因为参数是允许的,所以看起来它可以工作,但显然不行。
现在,您可以创建自己的操作属性,然后从中执行验证。

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

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

因为参数是允许的,所以看起来它可以工作,但显然不行。
现在,您可以创建自己的操作属性,然后从中执行验证。

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

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

{ serialNumber: "serial1234" }
但是,如果只接受单个字符串参数,那么请求的主体应该是“原始JSON字符串(而不是JSON对象)”。所以它应该是这样的:

"serial1234"

只有在请求的内容类型为“application/json”时才需要引号。如果您以“text/plain”的形式发送,那么您可能不需要引号。

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

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

{ serialNumber: "serial1234" }
但是,如果只接受单个字符串参数,那么请求的主体应该是“原始JSON字符串(而不是JSON对象)”。所以它应该是这样的:

"serial1234"

只有在请求的内容类型为“application/json”时才需要引号。如果您以“文本/普通”的形式发送,那么您可能不需要引号。

我认为您的最后一段基本上回答了您的问题,不是吗?嗯,不确定我是否回答了自己的问题。也许我做得不对。如果采用不同的方式,它可能会起作用……你可以在这里阅读如何自己实现:@Evk-不幸的是,我的公司阻止了你推荐的网站……:(我认为你的最后一段基本上回答了你的问题,不是吗?嗯,我不确定我是否回答了我自己的问题。也许我做得不对。如果用另一种方式做的话,它可能会起作用……你可以在这里读到你如何自己实现它:@Evk-不幸的是,我的公司阻止了你推荐的网站……:(标准JSON对象表示法根本不起作用。只有一个基本字符串(如第二个示例所示)实际将数据传递到控制器操作…标准JSON对象表示法根本不起作用。只有一个基本字符串(如第二个示例所示)实际上,将数据传递到控制器操作中…对于giggles,我创建了一个自定义验证属性并将其绑定到我的操作参数。它从未被调用。我想简单的答案是,当输入是字符串而不是属性可以用验证器属性修饰的类时,webApi不支持验证属性。Weird-我认为rest服务最基本的用途应该包括验证功能。话虽如此,我相信我会将参数放入一个类中,并在其中添加验证。这意味着有效负载大小将增加,并且需要封送才能将值从输入类中复制出来。走类的方式肯定更符合MVC处理它的方法。任何其他的工作都比这更值得。对于giggles,我创建了一个自定义验证属性,并将其绑定到我的操作参数。它从未被调用。我想简单的答案是,当输入是字符串而不是一个属性可以随时用validator修饰的类时,webApi不支持验证属性赞扬。奇怪-我认为rest服务最基本的用途应该包括验证功能。话虽如此,我相信我会将参数放入一个类中,并在其中添加验证。这意味着有效负载大小将增加,并且需要封送才能将值复制出输入类。采用类的方式是definitel这是一种更具MVC风格的处理方式。任何其他的工作都是值得的。