【发布时间】:2015-09-30 08:27:32
【问题描述】:
我在一个全新的 MVC Web API 项目中重现了我遇到的问题。
这是默认代码,稍作修改。
public string Get(int? id, int? something = null)
{
var isValid = ModelState.IsValid;
return "value";
}
如果你转到http://localhost/api/values/5?something=123,那么这工作正常,isValid 是true。
如果你去http://localhost/api/values/5?something=,那么isValid就是false。
我遇到的问题是,如果您为可为空的项目提供空值或省略值,则 ModelState.IsValid 会标记验证错误,提示 "A value is required but was not present in the request."
ModelState 字典也如下所示:
something 有两个条目,一个可以为空,我不确定它是否重要。
知道如何解决这个问题,以便在可空参数被省略或作为空参数提供时模型有效吗?我在我的 web api 中使用模型验证,如果每个带有可为空参数的方法都生成模型错误,它会破坏它。
【问题讨论】:
-
此处可能有用的信息:stackoverflow.com/a/11922978/3130094 - 大概您看到了这种情况,因为您没有完全省略
something参数,而是添加它并没有分配任何内容 -
我确实尝试在我的原始项目中弄乱 json 序列化程序,但我不确定如何在这个项目中将其设置为忽略,因为我没有发出 json 请求,而是使用浏览器(我相信是不同的,但可能是错的?)
-
asp.net 4.5.2 如果有帮助的话。我添加了
config.Formatters.JsonFormatter.SerializerSettings = new JsonSerializerSettings { NullValueHandling = NullValueHandling.Ignore };告诉它忽略空值的序列化和反序列化,但这不起作用。我不知道something=是否被视为null或"" (empty string),或者这个序列化程序是否甚至用于我的测试操作。 -
查看错误,有 2 个参数,但对 三个 参数有错误。如果您将 url 传递为:“/test/5?something.Nullable`1=" - 那么它通过验证。看起来您需要添加自定义绑定提供程序。
-
@SLC JsonSerializer 是否在此处执行任何操作,参数作为 url 参数提供,而不是通过 post 作为 json 提供。所以这个设置对你的问题没有任何作用
标签: asp.net-mvc asp.net-web-api model-binding