我有一个 Controller Action ,它接收一个整数和一个对象,其中包含各种属性,其中之一是对象的通用列表。当我使用填充列表将 JSON 发布到操作时,所有内容都正确映射,并且我得到一个包含我发布的对象的列表。但是,如果数组为空,则 MVC 操作将属性绑定(bind)到空列表而不是空列表。我希望空数组映射到一个空数组而不是 null,因为在这种情况下,空数组意味着集合中没有任何内容,而 null 意味着应该检查数据库以查看以前是否有任何内容保存在集合中,但我不知道需要更改什么才能使其正确映射。我们正在使用 Json.Net 对返回对象进行对象序列化,但我认为它不会用于模型绑定(bind)上的对象反序列化。
正在传递的对象:
public class ObjectInList
{
public decimal Value1 { get; set; }
public decimal Value2 { get; set; }
}
public class Criteria
{
public decimal? ANullableNumber { get; set; }
public IList<ObjectInList> ObjectsList { get; set; }
}
Json 请求: "{\"id\":137,\"criteria\":{\"ObjectsList\":[]}}"
Controller Action :
public ActionResult ProcessCriteria(int id, Criteria criteria)
{
return Json(_service.ProcessCriteria(id, criteria));
}
在 Controller 操作中,我在标准对象中得到一个空列表而不是一个空列表。无论我是否为其他属性发送空值,都会发生这种情况。不确定是否归结为对象是 IList 而不是 IEnumerable? (包装服务调用的 Json 方法是我们使用 Json.Net 返回 json 结果以序列化响应的包装器 - null 在接收到的条件对象中,而不是在返回中。)
我猜我错过了一些非常简单的东西,但我无法弄清楚是什么,非常感谢任何帮助。
最佳答案
好的,我在将近 5 个小时的时间里遇到了这个问题,试图找到解决方案 然后我发现自己正在查看 MVC 源代码。 我发现这是 System.Web.Mvc.ValueProviderResult 中的 Mvc 源代码的问题 在第 173 行:
else if (valueAsArray != null)
{
// case 3: destination type is single element but source is array, so extract first element + convert
if (valueAsArray.Length > 0)
{
value = valueAsArray.GetValue(0);
return ConvertSimpleType(culture, value, destinationType);
}
else
{
// case 3(a): source is empty array, so can't perform conversion
return null;
}
}
如你所见,如果 source 为空数组,它将返回 null。
所以我必须想办法解决它,然后我才想起过去我们是如何进行反序列化的: 这就是你得到你想要的东西的方式:
public ActionResult ProcessCriteria(int id, Criteria criteria)
{
var ser = new System.Web.Script.Serialization.JavaScriptSerializer();
StreamReader reader = new StreamReader(System.Web.HttpContext.Current.Request.InputStream);
reader.BaseStream.Position = 0;
criteria = ser.Deserialize<Criteria>(reader.ReadToEnd());
return Json(_service.ProcessCriteria(id, criteria));
}
https://stackoverflow.com/questions/14478793/
相关文章:
javascript - 通过 AJAX 和 jQuery 从 PHP 数组中获取数据
javascript - 无法重新初始化 JQuery DataTable
ruby-on-rails - 为什么在 Ubuntu 中安装 JSON gem 时会出错?
javascript - 如何处理奇怪组合的 websocket 消息?
c# - WebApi Put如何从指定的属性中告诉未指定的属性设置为null?
c# - 如何使用 C#/LINQ 将 XML 转换为 JSON?
c# - 分配给单个属性的多个 JsonProperty 名称