最新消息:雨落星辰是一个专注网站SEO优化、网站SEO诊断、搜索引擎研究、网络营销推广、网站策划运营及站长类的自媒体原创博客

javascript - Flattening a complex json object for mvc binding - Stack Overflow

programmeradmin2浏览0评论

My controller is returning an object graph to the view in json format like this

return Json(customer);

On the view my json object looks like this

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

Which maps correctly to my customer object:

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;} 
}

I want to pass that same json object back to another method on the controller with this signature:

public ActionResult Method(Customer customer)

When I do this customer's name get populated but not the Budget class, which I understand why because the modelbinder is expecting this: {Name:'Joe','Budget.Amount':500,'Budget.Spend': 100}

So I have to options: 1. I can return the json object in the format it wants, but I don't know how because you can't do this:

return Json(new { Budget.Amount= 500})
  1. I can flatten the json object on the client side. Is there plugins or methods to do this?

My controller is returning an object graph to the view in json format like this

return Json(customer);

On the view my json object looks like this

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

Which maps correctly to my customer object:

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;} 
}

I want to pass that same json object back to another method on the controller with this signature:

public ActionResult Method(Customer customer)

When I do this customer's name get populated but not the Budget class, which I understand why because the modelbinder is expecting this: {Name:'Joe','Budget.Amount':500,'Budget.Spend': 100}

So I have to options: 1. I can return the json object in the format it wants, but I don't know how because you can't do this:

return Json(new { Budget.Amount= 500})
  1. I can flatten the json object on the client side. Is there plugins or methods to do this?
Share Improve this question asked Feb 5, 2010 at 21:09 adriaanpadriaanp 2,0742 gold badges23 silver badges40 bronze badges 2
  • but you can do this, right? not sure if this solves your entire problem: return Json(new { Budget = new { Amount = 500 }}) – RationalGeek Commented Feb 5, 2010 at 21:43
  • i am trying to flatten json object so that the result is '{ 'Budget.Amount' = 500 }' – adriaanp Commented Feb 5, 2010 at 21:47
Add a ment  | 

3 Answers 3

Reset to default 5

Here's a function that convert an object to a flat hash

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;
}

Protovis has a JavaScript flattener, available under the BSD License.

In my case we have solved it by passing additional object to the action url.

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

to make this happen you have to flatten the json data (before you sent it to controller) in following way:

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

发布评论

评论列表(0)

  1. 暂无评论