【问题标题】:Flattening a complex json object for mvc binding为 mvc 绑定展平复杂的 json 对象
【发布时间】:2010-02-05 21:09:23
【问题描述】:

我的控制器正在像这样以 json 格式将对象图返回到视图

return Json(customer);

在视图上我的 json 对象看起来像这样

{
    Name: 'Joe',
    Budget: { Amount: 500, Spend: 100 }
}

正确映射到我的客户对象:

public class Customer 
{
    public string Name {get;set;}
    public Budget Budget{get;set;} 
}

public class Budget  
{
    public decimal Amount{get;set;}    
    public decimal Spend{get;set;} 
}

我想用这个签名将同一个 json 对象传回控制器上的另一个方法:

public ActionResult Method(Customer customer)

当我填充这个客户的名字而不是预算类时,我理解为什么,因为模型绑定器期望这样:{Name:'Joe','Budget.Amount':500,'Budget.Spend': 100 }

所以我必须选择: 1.我可以返回它想要的格式的json对象,但是我不知道怎么做,因为你不能这样做:

return Json(new { Budget.Amount= 500})
  1. 我可以在客户端展平json对象。是否有插件或方法可以做到这一点?

【问题讨论】:

  • 但是你可以做到这一点,对吧?不确定这是否能解决您的整个问题: return Json(new { Budget = new { Amount = 500 }})
  • 我正在尝试展平 json 对象,以便结果是 '{ 'Budget.Amount' = 500 }'

标签: javascript asp.net-mvc json


【解决方案1】:

这是一个将对象转换为平面哈希的函数

function flatten(json){
    var nj = {},
        walk = function(j){
            var jp;
            for(var prop in j){
                jp = j[prop];
                if(jp.toString() === "[object Object]"){
                    walk(jp);
                }else{
                    nj[prop] = jp;
                }
            }
        };
    walk(json);
    return nj;
}

【讨论】:

  • 哦不...您想将 json 扁平化为哈希?
  • 您的解决方案可以使用,但我需要将“Budget.Amount”作为属性名称,我目前正在通过将前缀变量传递给“walk”函数来实现
  • 关于不良做法...我不知道您的服务器端限制,但是是的...它看起来像麻烦的收据。
【解决方案2】:
【解决方案3】:

在我的例子中,我们通过将附加对象传递给操作 url 来解决它。

public ActionResult Method(Customer customer, [Bind(Prefix="Budget")]Budget budget)

要做到这一点,您必须通过以下方式展平 json 数据(在将其发送到控制器之前):

How to pass complex type using json to ASP.NET MVC controller

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-10-02
    • 1970-01-01
    • 1970-01-01
    • 2017-06-13
    • 1970-01-01
    • 2013-05-29
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多