为什么 MVC3 modelbinder 不会解析 List>其中包含空的 List

本文关键字:List int MVC3 包含空 modelbinder 为什么 | 更新日期: 2023-09-27 18:33:17

我有一种List<List<int>>,我正在尝试让 MVC3 中的模型绑定器解析并失败。 我的控制器将该类型作为参数,当我像这样发送完全填充的列表时,它可以工作。

有效、正确解析/绑定的数据

[ [ 22, 12, 9 ], [1, 2, 3], [5] ]

一旦我将相同的数据结构发送到控制器,但这次使用空数组,它就会停止解析外部集合。 以下是活页夹阻塞的一些数据:

有效、解析/绑定不正确的数据

[ [ 4, 5], [], [6, 7] ]

该值绑定到一个List<List<int>>,但它的长度为 1,第一项是 List<int> 4, 5

那么,当某些List<int>是空列表时,如何让模型绑定器接受List<List<int>>呢? 我需要上面显示的"有效、未正确解析/绑定"数据才能工作。

更糟糕的是,ModelState中没有绑定错误!

如果这很重要,这也会作为 JSON 发送到控制器(通过 application/json(。 我想如果这是一个错误,它很可能特定于该 json 模型绑定器。

为什么 MVC3 modelbinder 不会解析 List<List<int>>其中包含空的 List<int>

这必须只是模型绑定器中的实现细节或实现错误。 如果您传递null而不是空List<int>[],它将正常工作。

此解决方法的一个奇怪细节是null值被转换为空值List<int>

如果您发送

[ [ 4, 5], null, [6, 7] ]

然后,List<List<int>>中的项目将是:

 [0] = List<int> {4, 5}
 [1] = List<int> {}
 [2] = List<int> {6, 7}

我仔细检查了一下,索引1绝对是一个空列表,您可以访问其计数等。

此外,MVC 中的默认 Json 序列化程序会将该列表序列化为

[ [ 4, 5], [], [6, 7] ]

而不是

[ [ 4, 5], null, [6, 7] ]

乐趣。