2013-07-30 6 views
0

Ceci est ma fonction jquery. Je voudrais poster cet objet sur le contrôleur. Tout fonctionne bien sauf le ListOfCBToDisplay, qui est une liste.Comment soumettre un objet JSON qui contient également un tableau?

<script> 
function Submit_Movie() { 
    // 
    var title = $('[id*="Title"]').val(); 
    var yearOfMaking = $('[id*="YearOfMaking"]').val(); 
    var description = $('[id*="Description"]').val(); 

    var movie = 
    { 
     "Title": title, 
     "YearOfMaking": yearOfMaking, 
     "Description": description, 

     "ListOfCBToDisplay" : [] 
    }; 

    // 
    var $cbx = $('[id*="cbx"]');   
    $cbx.each(function() { 
     var id = GetID($(this).attr('id')); 
     var ck = $(this).prop("checked"); 
     alert(id + ", " + ck);  //The alert is displaying correctly all the values 

     var new_obj = { "ID": id, "Value": ck, "Text": "" }; 
     movie.ListOfCBToDisplay.push(new_obj); 
    }) 

    // 
    var url = "@Url.Action("AddEditMovie", "Admin")"; 
    $.post(url, movie, function (data) { 
     location.reload(); 
    }); 
} 
function GetID(elt_id) { 
    var _id = elt_id.split('_'); 
    if (_id.length == 2) { 
     return _id[1]; 
    } 
    else { 
     return 0; 
    } 
} 

C'est la classe Movie

public class Movie 
{ 
    public Movie() 
    { 
     ListOfCBToDisplay = new List<CheckBoxToDisplay>(); 
    } 

    // more properties ... 

    public List<CheckBoxToDisplay> ListOfCBToDisplay { get; set; } 
} 

Et ceci est l'action

[HttpPost] 
    public ActionResult AddEditMovie(Movie movie) 
    { 
     //More here ... 
    } 

Toute raison pour laquelle toutes les propriétés primitives obtiennent leurs valeurs alors que les objets la liste a des valeurs nulles, c'est-à-dire ID = 0, Text = null et Value = false? Cependant, le nombre d'objets est toujours correct, seules les valeurs sont nulles.

Merci de nous aider

+0

0, NULL et false sont tous 0 en interne. Êtes-vous sûr qu'ils sont en train de se mettre en place? –

+0

Je ne sais pas. Toutes les propriétés des primitives, telles que Title, Description, sont définies correctement. Seules les valeurs du tableau ne sont pas définies. Regardez le code. J'ai mis une alerte là-bas et j'obtiens les bonnes valeurs. – Richard77

Répondre

1

Vous pouvez essayer d'utiliser JSON pour JSON.stringify(myObject); l'objet. Ou vous pouvez simplement sérialiser votre chaîne avec la méthode JS join:

var myList = []; 
$cbx.each(function() { 
    var id = GetID($(this).attr('id')); 
    var ck = $(this).prop("checked"); 
    alert(id + ", " + ck);  //The alert is displaying correctly all the values 

    var new_obj = id+"~"+ck; // here `~` is id/value separator 
    myList.push(new_obj); 
}) 
movie.ListOfCBToDisplay = myList.join("^"); // here '^' is a separator 

Puis dans votre côté serveur vient diviser la chaîne en utilisant le séparateur ^ pour obtenir la liste des id/valeurs, puis diviser chacun d'entre eux par ~. C'est en fait sérialiser manuellement l'objet.

EDIT

Une autre approche serait de copier toutes les valeurs nécessaires comme <input type='hidden'> à un <form> caché puis utilisez le JQuery serialize() sur le formulaire. Peut-être que vous pouvez utiliser le formulaire actuel pour le faire.

+0

Lorsque j'utilise JSON.stringify (myObject) ou myList.join ("^"), le ListOfCBToDisplay n'est même pas rempli. Quand je reviens à mon code, ListOfCBToDisplay est une liste du nombre exact d'objets. Mais ces objets ont seulement la valeur par défaut, pas les valeurs entrantes. – Richard77

+0

J'ai édité l'exemple de code (j'ai initialement ignoré le format de données). J'ajoute aussi une autre approche. – JScoobyCed

+0

Merci pour ces différentes possibilités. En fait, j'ai utilisé la technique où vous concaténer des valeurs dans une chaîne. De cette façon, je n'ai pas besoin de créer une forme partout. Cependant, vous n'avez pas mentionné que la propriété de réception dans l'action doit être une chaîne. Merci beaucoup. – Richard77

Questions connexes