2010-03-08 10 views
1

Je suis en train de poster un objet de données JavaScript avec les éléments suivants:Modèle se lier à une liste <> lors de la publication JavaScript Data Object

$.post(frm.attr("action"), data, function(res) 
{ 
    // do some stuff 
}, "json"); 

où 'données' prend la structure de

data 
- panelId 
- siteId 
- ConfiguredFactsheetId // this is an array of CheckBox ids that correspond to ConfiguredFactsheets 
    - 123 
    - 234 
    - 345 

Avec ce, les deux site & panneau sont correctement instanciées & lié avec leurs données mais l'objet List est null. Maintenant, je me rends compte que la propriété ConfiguredFactsheetId de mon objet 'data' est juste un tableau de valeurs d'id. Dois-je spécifier que chaque valeur correspond à une propriété configuredFactsheetId de mon objet ConfiguredFactsheet? Si oui, mon objet de données prendrait une forme similart à

data 
- panelId 
- siteId 
- ConfiguredFactsheet // this is an array of CheckBox ids that correspond to ConfiguredFactsheets 
    - ConfiguredFactsheetId:123 
    - ConfiguredFactsheetId:234 
    - ConfiguredFactsheetId:345 

mais évidemment ne fonctionnera pas parce que chaque fois que j'ajoute une nouvelle ConfiguredFactsheetId à l'objet, il vous reste plus qu'à remplacer le précédent.

Je sais que je peux le faire si je construit une chaîne de requête du formulaire

"&ConfiguredFactsheet[i].configuredFactsheetId = " + configuredFactsheetId; 

mais je voudrais tout contenir en un seul objet de données

Toutes les suggestions? Ai-je besoin d'expliquer quelque chose (probablement tout!) Plus clairement?

Merci

Dave

+0

AFAIK si vous avez un tableau nommé 'ConfiguredFactsheet', vous devriez avoir les noms des paramètres de configuredFactsheet'. S'il stocke la liste des ints, il pourrait être 'IEnumerable '. Utilisez donc 'public JsonResult Edit (IEnumerable configuredFactsheet)'. Comment panelId est-il transformé en panel? Avez-vous votre propre ModelBinder? – LukLed

Répondre

1

En fin de compte, cela a fonctionné:

var valuesArray = objCheckBoxes.map(function() 
{ 
    return $.getAttributes($(this)); 
}); 

var obj = new Array(); 
$.each(valuesArray, function(item) { obj.push($(this)[0]); }); 

$.each(obj, function(i) 
{ 
    // basically I take the rule where you need to append 
    // the index to the type, and I apply it here. 
    data["configuredFactsheets[" + i + "].configuredFactsheetId"] = $(this).attr("configuredFactsheetId"); 
}); 

Note: lire $.getAttributes

0

Une alternative consiste à envoyer des messages:

?myValues=1&myValues=2&myValues=3 

Et l'accepter comme un IEnumerable

public ActionResult DoSomething(IEnumerable<int> myValues) { 
    ...