无法在WebApi应用程序中为包含可空类型且具有空值的对象传递ModelState验证。错误消息是“值'null'对DateProperty无效。”
对象代码:
public class TestNull
{
public int IntProperty { get; set; }
public DateTime? DateProperty { get; set; }
}
控制器:
public class TestNullController : ApiController
{
public TestNull Get(int id)
{
return new TestNull() { IntProperty = 1, DateProperty = null };
}
public HttpResponseMessage Put(int id, TestNull value)
{
if(ModelState.IsValid)
return Request.CreateResponse(HttpStatusCode.OK, value);
else
{
var errors = new Dictionary<string, IEnumerable<string>>();
foreach (var keyValue in ModelState)
{
errors[keyValue.Key] = keyValue.Value.Errors.Select(e => e.ErrorMessage);
}
return Request.CreateResponse(HttpStatusCode.BadRequest, errors);
}
}
}
请求:
$.getJSON("api/TestNull/1",
function (data) {
console.log(data);
$.ajax({
url: "api/TestNull/" + data.IntProperty,
type: 'PUT',
datatype: 'json',
data: data
});
});
答案 0 :(得分:2)
我刚刚在一个自己的WebAPI项目中进行了快速测试,并将null作为可以为空的值类型的值传递。我建议您使用Fiddler
等工具检查发送到服务器的实际数据两个有效的方案是:
{ IntProperty: 1, DateProperty: null }
{ IntProperty: 1 } // Yes, you can simply leave the property out
NOT 工作的场景是:
{ IntProperty: 1, DateProperty: "null" } // Notice the quotes
{ IntProperty: 1, DateProperty: undefined } // invalid JSON
{ IntProperty: 1, DateProperty: 0 } // Will not be properly interpreted by the .NET JSON Deserializer
如果两个默认情况不起作用,那么我怀疑你的问题出在其他地方。即您是否更改了global.asax中的JSON序列化程序的任何默认设置?
答案 1 :(得分:0)
将近 9 年后,我在 ASP.NET Core 3.1 中仍然遇到类似的问题
但我找到了一个可行的解决方法(只需从发送的数据中排除空值 - 而不是将值作为空值发送)。
见https://stackoverflow.com/a/66712465/908608
这不是一个真正的解决方案,因为后端仍然不能正确处理空值,但至少 ModelState 验证不会为可空属性失败。