2010-07-14 9 views
0

J'ai créé un tableau d'objets javascript côté client que je souhaite publier sur le serveur. Mais quand je fais ce qui suit le tableau revient comme Serverside 'non défini' dans le FormCollection.Publication d'objets Javascript avec jQuery dans MVC ActionResult

J'utilise jQuery et voici mon code javascript:

function MyObject(){ 
    this.Param1; 
    this.Param2; 
} 

var myArray = new Array(); 

var newObject1 = new MyObject(); 
newObject1.Param1 = "abc"; 
newObject1.Param2 = "efg"; 
myArray.push(newObject1); 

var myArray = new Array(); 
var newObject2 = new MyObject(); 
newObject2.Param1 = "hij"; 
newObject2.Param2 = "klm"; 
myArray.push(newObject2); 

$.post("Save", myArray, function (result) { PostDataCallBack(result); }); 

Quelqu'un at-il un exemple de quelque chose comme ceci ou des idées sur la façon de sérialisation des objets javascript et les poster?

Merci :)

+0

Pouvez-vous poster votre code ActionResult où vous obtenez «indéfini»? –

+0

Un problème est que vous définissez 'var myArray = new Array();' deux fois, laissant ainsi tomber le premier objet que vous insérez dans "myArray". –

Répondre

1

Les éléments de votre tableau doivent avoir le même nom lorsque porté à votre actionMethod. Tant qu'ils ont le même nom, le modelBinder les récupérera probablement et les bourrera dans le param de tableau de votre actionMethod. À l'heure actuelle, il semble que vous ne définissiez pas de nom pour votre tableau. Cela peut signifier qu'il utilise un nom par défaut, mais le nom de votre paramètre actionMethod doit correspondre.

Essayez ceci:

$.post(
    "Save", 
    { myArray: myArray }, 
    function (result) { PostDataCallBack(result); } 
); 

Essayez d'avoir la classe aC# qui correspond à votre objet javascript afin que le ModelBinder peut vraiment faire quelque chose de gentil pour vous:

public class MyObject 
{ 
    public string Param1 { get; set; } 
    public string Param2 { get; set; } 
} 

Ensuite, votre méthode d'action devrait ressembler à cela:

public ActionResult Save(MyObject[] MyArray) { 
    //DO STUFF HERE 
}