【问题标题】:MVC 4: pass complex object to async controller actionMVC 4:将复杂对象传递给异步控制器操作
【发布时间】:2013-02-26 12:28:05
【问题描述】:

我正在尝试使用 Javascript 将订单列表传递给异步控制器操作:

var model = "<some JSON string>";
$.ajax({ type: "POST",
  url: "/MyController/MyAction",
  datatype: "json",
  data: { 'orderLines': model},
  success: function(msg) {
     ...
  }
});

当我在运行时检查模型变量时,订单线属性的值设置正常。但是当我在控制器操作中设置断点时,orderline 传入参数的属性为 0。看起来 JSON 字符串没有正确反序列化。

控制器动作如下所示:

public ActionResult AsyncUpdateOrderline(List<OrderLine> orderLines)
{
  ...
}

如何正确地将复杂对象传递给异步控制器操作?

谢谢, 尼尔斯

【问题讨论】:

    标签: jquery asp.net-mvc asp.net-mvc-4


    【解决方案1】:

    需要设置请求的Content-Type头,同时使用JSON.stringify方法向控制器发送数据:

    var model = [
        { quantity: 1, name: 'some name 1' },
        { quantity: 2, name: 'some name 2' }
    ];
    
    $.ajax({ 
        url: '/MyController/MyAction',
        type: 'POST',
        contentType: 'application/json',
        data: JSON.stringify({ orderLines: model }),
        success: function(msg) {
            ...
        }
    });
    

    请注意,模型不应是 JSON 字符串,而是 javascript 数组对象,其中每个元素都反映您的 OrderLine 模型的结构。

    【讨论】:

    • 谢谢,它现在几乎可以工作了。唯一不起作用的:我在订单行中有一个 UnitPrice 对象。这个对象的所有字段都可以反序列化,除了 Amount 字段。它在控制器操作中为 0,而在 JSON 字符串中设置为十进制值。有什么想法吗?
    • 尝试在您的 javascript 对象中将其设置为字符串。例如:{ unitPrice: '12.34' } 而不是 { unitPrice: 12.34 }。如果您对为什么这是必要的详细信息感兴趣,您可以查看我解释过的以下答案:stackoverflow.com/a/8968207/29407
    • JSON 字符串由 JavaScriptSerializer().Serialize(obj) 生成。有没有什么聪明的方法可以影响 JavaScriptSerializer 如何处理十进制值?如果没有,我必须进行更脏的修复。
    • 恐怕没有。解决方法是改用字符串属性。
    • 我想指出 contentType: 'application/json' 很重要。我第一次错过了。
    猜你喜欢
    • 2020-04-23
    • 2012-10-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-03-05
    • 1970-01-01
    相关资源
    最近更新 更多