【问题标题】:Model Validation for Primitives in ASP.NET Web APIASP.NET Web API 中基元的模型验证
【发布时间】:2018-08-15 20:18:09
【问题描述】:

我们定义了一个 Get 方法,它接受一长串可空类型作为参数。比如:

[Route("api/person/get")]
public IEnumerable<Person> Get(int? age = null, string name = null, bool? isDeceased = null)
{
    ...
}

这里的想法是所有输入参数都可以为空。它们要么提供参数值,要么不提供。如果他们这样做,我们将使用它来过滤他们的结果。这消除了客户端构造 JSON 对象并将其传入的需要。

问题 1:这是个好主意吗?

问题 2 是我们不希望他们通过“ABC”作为年龄。如果有,Age 参数将被填充为 null。这并不理想。相反,我们想抛出一个适当的异常。

如果看到很多关于定义 ValidateModelAttribute 并用它装饰我的 web api 方法的帖子(例如https://www.jerriepelser.com/blog/validation-response-aspnet-core-webapi/)。我的问题是,如果任何可空参数实际上为空,则 ModelState.IsValid 为假。因此,除非它们为每个参数提供一个参数(我们的真实方法有 67 个),否则 ModelState.isValid 将为 false。

提前感谢您的帮助。

亚伦

【问题讨论】:

  • 在您的 Person 模型中,您设置属性的类型并使它们可以为空。如果属性类型正确,则模型状态将有效。
  • 谢谢,但它没有回答我的第一个问题。如果我传入模型对象,您的建议会起作用。但我传递了一个原语列表。

标签: c# asp.net-web-api model-binding


【解决方案1】:

ModelState 是 MVC 的东西,而不是 WebAPI 的东西;这就是为什么它总是false。使用可为空的参数装饰方法签名没有任何问题。如果您想为类型创建一些自定义错误,我会推荐this link。如果你想连接ModelState 在 WebAPI 中工作,推荐this link

【讨论】:

    【解决方案2】:

    事实证明,ModelState 实际上确实适用于 WebApi,但如果您有任何空白输入参数,它将为 IsValid 返回 false。所以如果你打电话

    https://myApiSite/api/person/get?name=Aaron&age=

    ModelState.IsValid 将为 false,因为年龄参数为空白。

    另一方面,如果你调用

    https://myApiSite/api/person/get?name=Aaron

    ModelState.IsValid 将为真。年龄仍然是空白,您没有通过的所有其他参数也是如此,但模型将通过验证。去图吧。

    谢谢。

    亚伦

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-12-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-05-22
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多