【问题标题】:MVC Deserializes null into "null" (string)MVC 将 null 反序列化为“null”(字符串)
【发布时间】:2012-06-30 08:36:35
【问题描述】:

我通过 $.ajax POST 将一个对象从 jQuery 传递到 MVC3 控制器。在使用开发人员工具进行调试时,我可以看到我分配给 ajax 数据属性的对象。该对象包含值为 null 的属性。当我调试控制器时,JS 调试器中为空的属性现在是“空”(字符串)。

这是为什么?我能做些什么来防止这种情况发生?

C# 对象

public class User
{
   public string Name { get; set; }
}

Javascript 对象

var user = {
Name: null
}

控制器方法

public JsonResult HelloWorld(User user) { .. some logic .. }

ajax 调用

var data = user;
$.ajax({
url: '/Controller/HelloWorld/',
data: data,
type: 'post',
success: ...
error: ...
})

【问题讨论】:

  • 能否展示相关代码(js和cs)?
  • 我们没有做任何特别的事情。创建一个 c# 对象,创建一个匹配的 javascript 对象(将一些属性保留为空),然后使用 jQuery ajax 将该对象发布到控制器方法。该对象的属性为“null”,因此 Controller 方法中的逻辑无关紧要。
  • 酷,你能在 JavaScript 中显示 如何 你在 POST 中做到这一点吗?
  • 我已经为你更新了问题。
  • 诚实的问题。您是否尝试过指定contentType: 'application/json; charset=utf-8'? (不是 100% 确定它在这种情况下是否有帮助)

标签: asp.net-mvc


【解决方案1】:

是的,这是默认模型绑定器的一个不幸的副作用。您可以通过在请求中完全不包含 null 属性或使用 JSON 请求来避免它:

$.ajax({
    url: '@Url.Action("HelloWorld", "Controller")',
    data: JSON.stringify({ Name: null }),
    contentType: 'application/json',
    type: 'post',
    success: function (result) {
        // ...
    }
});

注意事项:

  • contentType: 'application/json'
  • JSON.stringify 围绕 data 参数,以便将请求转换为 JSON 字符串。

【讨论】:

  • 所以事实证明contentType 在这种情况下毕竟有一点帮助
  • 是的,它有帮助,因为它现在是 JSON 值提供者工厂,它使用 JavaScriptDeserializer 类来处理解析,而不是默认的模型绑定器。
  • 是的,我建议但 OP 从未回复。至于null-"null" 问题,我在另一个问题中推荐了这种方法,但JSON.stringify 绝对是要走的路,所以你不必检查每个单独的属性...... +1
猜你喜欢
  • 1970-01-01
  • 2014-10-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-08-04
  • 1970-01-01
  • 2020-06-23
  • 2019-04-03
相关资源
最近更新 更多