【发布时间】:2014-04-23 20:32:19
【问题描述】:
尝试通过 Ajax 提交 JSON 负载到我的 MVC 控制器时,我看到了非常奇怪的行为。
代码如下:
[HttpPost]
public ActionResult ResetEligibility(EmployeeEligibilityFilter filter) { ... }
public class EmployeeEligibilityFilter
{
public List<int> Selection { get; set; }
public bool SelectionInverted { get; set; }
public int? BenACACalendarCycleId { get; set; }
...
}
有效负载:
{"BenACACalendarCycleId":2,"SelectionInverted":false,"Selection":[680,698,875]}
现在,如果我提供少于 3 个元素的 Selection 列表,Selection 属性会突然在服务器端以 null 出现。
{"BenACACalendarCycleId":2,"SelectionInverted":false,"Selection":[680,875]}
其他属性继续正确反序列化。
我们在这里迷路和困惑......
更多调查:将模型属性从 List<int> 更改为 List<object> 神奇地使事情正常进行。存储在对象列表中的元素仍然是System.Int32。
我什至尝试像这样并排使用它们:
public class EmployeeEligibilityFilter
{
public int? BenACACalendarCycleId { get; set; }
public bool SelectionInverted { get; set; }
public List<int> Selection { get; set; }
public List<object> _Selection { get; set; }
}
并在两者中发送完全相同的数组:
{"BenACACalendarCycleId":2,"SelectionInverted":false,"Selection":[663],"_Selection":[663]}
最终结果还是一样。 Selection 显示为 null,但 _Selection 已正确反序列化。
巫毒魔法...
【问题讨论】:
-
您能运行 fiddler 并发布您在此处发布的两个不同查询的结果吗?
-
我想看一下用于发布帖子的代码的 sn-p,ResetEligibility 内部的一些代码,以及使用 Fiddler 之类的工具进行一些间谍活动的结果,之前花时间制作一个测试应用程序。 (看起来詹姆斯也提出了同样的建议。)
-
我发布的两个 JSON 有效负载取自 Fiddler,即这正是发送到服务器的内容。
ResetEligibilityaction 实际上还没有做任何事情。我通过在方法中设置断点并检查filter参数来查看破损 -
我认为可能反序列化程序将逗号视为小数分隔符,尝试将 List 更改为 List
作为一个小测试...... -
它似乎正在使用
decimal,但我怀疑逗号是这里的问题。在我的最后一次迭代中,我使用一个没有逗号的选择值进行测试。
标签: c# asp.net-mvc json