2010-02-05 13 views
5

Mein Controller zur Ansicht im JSON-Format, wie dies auf dem View Objekt sieht mein jsonAbflachen ein komplexes JSON-Objekt für MSL-Bindung

return Json(customer); 

einen Objektgraph zurückkehrt wie diese

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

Welche Ordnet korrekt meinem Kundenobjekt zu:

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

Ich möchte das gleiche JSON-Objekt zurück an Anoth übergeben er Methode auf dem Controller mit dieser Signatur:

public ActionResult Method(Customer customer) 

Als ich dieses Kunden Namen tun bevölkert bekommen, aber nicht die Budget-Klasse, die ich verstehe, warum, weil der Modelbinder dies erwartet: {Name: ‚Joe‘, 'Budget .Amount ': 500,' Budget.Spend ': 100}

So muss ich Optionen: 1. Ich kann das Json-Objekt in dem Format zurückgeben, das es will, aber ich weiß nicht, wie Sie können' t dies tun:

return Json(new { Budget.Amount= 500}) 
  1. Ich kann das JSON-Objekt auf der Clientseite reduzieren. Gibt es dafür Plugins oder Methoden?
+0

aber Sie können dies tun, oder? nicht sicher, ob dies Ihr gesamtes Problem löst: return Json (neu {Budget = neu {Betrag = 500}}) – RationalGeek

+0

Ich versuche, Json-Objekt zu glätten, so dass das Ergebnis '{' Budget.Amount '= 500}' – adriaanp

Antwort

5

Hier ist eine Funktion, die ein Objekt zu einem flachen 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; 
} 
+0

ist Oh nein ... willst du den JSON in einen Hash platt machen? – Mic

+1

Ja, stimmt irgendetwas nicht damit? Schlechte Praxis? – adriaanp

+0

Ihre Lösung wird funktionieren, aber ich muss 'Budget.Amount' als Eigenschaftsname haben, ich mache es gerade durch die Übergabe einer Präfix-Variable an die 'Walk' -Funktion – adriaanp

0

In meinem Fall wandelt wir es, indem zusätzliches Ziel der Aktion URL gelöst haben.

public Action Methode (Customer Kunde [Bind (Prefix = "Budget")] Haushaltsbudget)

, damit dies geschieht, um die JSON-Daten zu glätten hast (bevor Sie es geschickt an dem Controller) in folgenden Weise :

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

Verwandte Themen