【问题标题】:Are inline attribute validators allowed?是否允许内联属性验证器?
【发布时间】:2018-09-15 13:20:38
【问题描述】:

在创建 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 为真。此外,如果我不传递任何参数 ModelState.IsValid 也是如此。在这两种情况下,我都认为ModelState.IsValid 是错误的。

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

【问题讨论】:

  • 我认为你的最后一段几乎回答了你的问题,不是吗?
  • 好吧,我不确定我是否回答了自己的问题。也许我做得不对。如果以不同的方式完成,也许它会起作用......
  • 您可以在此处阅读如何自己实现它:blog.markvincze.com/…
  • @Evk - 不幸的是,我的公司屏蔽了您推荐的网站... :(

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


【解决方案1】:

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

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

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

【讨论】:

  • 为了傻笑,我创建了一个自定义验证属性并将其绑定到我的操作参数。它永远不会被调用。我想简单的答案是当输入是字符串而不是可以用验证器属性修饰属性的类时,webApi 不支持验证属性。奇怪 - 我原以为休息服务的最基本用途将包括验证功能。话虽如此,我相信我会将参数封装到一个类中并在那里添加验证。这意味着负载大小将增加,并且需要将值从输入类中复制出来。
  • 走类的方式绝对是更多的 MVC 处理方式。其他任何事情都是值得的。
【解决方案2】:

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

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

{ serialNumber: "serial1234" }

但是,如果您只接受一个字符串参数,那么according to the documentation,您的请求正文应该是“原始 JSON 字符串(不是 JSON 对象)”。所以它应该看起来像这样:

"serial1234"

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

【讨论】:

  • 标准 JSON 对象表示法根本不起作用。只有一个基本字符串(如您的第二个示例)实际上将数据传递到控制器操作中......
猜你喜欢
  • 2019-08-25
  • 1970-01-01
  • 2013-01-15
  • 2012-12-05
  • 2010-10-13
  • 2019-12-09
  • 2011-04-24
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多