2010-06-10 4 views
1

J'ai un modèle et j'utilise ajax.post. Je peux voir que la liaison de modèle n'est pas faite pour les arraylists dans mon modèle, bien que la liaison soit faite pour les propriétés de type int ou string. Pourquoi est-ce si? Mon code est comme ci-dessous.Difficulté de liaison de modèle

J'ai un modèle avec les propriétés suivantes

public class ProjectModel 
{ 
    public int ID { get; set; } 
    public ArrayList Boys= new ArrayList(); 

}

À mon avis, j'ai

$(document).ready(function() { 
    var project = new Object(); 
     var Boys= new Array(); 
var ID; 
....... 
ID = $('#ID').val(); 
project.Boys= Boys; 

.....

$.ajax({ 
       type: "POST", 
       url: '<%=Url.Action("Create","Project") %>', 
       data: JSON.stringify(project), 
       contentType: "application/json; charset=utf-8", 
       dataType: "html", 
       success: function() { 
       }, 
       error: function (request, status, error) { 
             } 
      }); 

//

Mon contrôleur

[AcceptVerbs(HttpVerbs.Post)] 
    public ActionResult Create(ProjectModel project) 
    { 
     try 
     { 
      project.CreateProject(); 
      return RedirectToAction("Index"); 
     } 

....

+1

'ArrayList' n'est pas générique. Quel type d'objets avez-vous l'intention de stocker à l'intérieur? Un 'Liste ' ou 'Boy [] 'générique serait plus approprié ici où vous devez définir chaque propriété du type' Boy'. –

+0

Pouvez-vous expliquer s'il vous plaît en utilisant un exemple? Je remplis le tableau dans la vue et je veux avoir une liaison de modèle arary. En fait, je peux voir que les valeurs envoyées à partir des vues ne sont pas liées au modèle et les tableaux ont toujours les valeurs déjà instanciées. Comment puis-je résoudre ce problème? – learning

Répondre

1

Le ModelBinding se fait en utilisant le nom. Pour toute collection que vous voulez être lier, il doit avoir ce format:

project.property1 
project.property2 

et pour la Collection Garçons

project.Boys[0].property1 
project.Boys[0].property2 

project.Boys[1].property1 
project.Boys[1].property2 

Si vous utilisez un formulaire, vous pouvez simplement définir correctement les noms des entrées et en utilisant jquery:

//inside the ajax definition 
    data: $('#formID').serialize(), 

EDIT: si les garçons ne possèdent pas de propriétés alors le nom doit être:

project.Boys[0] 
project.Boys[1] 
project.Boys[2] 

Avez-vous essayé la liaison avec un second paramètre comme celui-ci?

public ActionResult Create(ProjectModel project, string[] Boys) 

Je n'ai pas utilisé ArratList parce que je l'ai fait quelques tests et il le fait, je préfère ne semble pas lier tout d'utiliser une déclaration de tableau normale.

Une autre chose que vous pouvez essayer d'inspecter le FormCollection

public ActionResult Create(FormCollection f) 

mettre un point d'arrêt juste au début et à inspecter les valeurs, si les noms à l'intérieur ne suivent pas le format project.Boys il ne sera jamais se lier.

EDIT2: Si vous souhaitez associer à plusieurs tableaux, puis ajoutez simplement une définition de collection au modèle:

public class ProjectModel 

    { 
     public IEnumerable<string[]> Boys { get; set; } 
    } 

et les noms devraient être: pour le premier tableau:

project.Boys[0] 
project.Boys[0] 

pour la seconde:

project.Boys[1] 
project.Boys[1] 

. . .

Mais pour archiver cela, la définition de Boys en Javascript devrait être aussi une collection de colecction et je ne sais pas comment la définir en js.

PD: si vous poussez la valeur manuellement aux tableaux et que les valeurs provient des entrées comme vous l'avez ici Boys.Push($('#tex1').val()) alors vous devriez être en mesure de sérialiser ces entrées et vous faire économiser beaucoup d'ennuis = D. -à-dire: pour simuler votre situation, il serai quelque chose comme ...

<% using (Html.BeginForm()) 
     { %> 
     <% var i1 = 5; %> 
     <% var i2 = 5; %> 
     <% for(var i=0; i < i1; i++) 
      { %> 
      <% for (var ix = 0; ix < i2; ix++) 
      {%> 
      <input name="boys[<%=i %>]" value="VALUE_HERE"/> 
      <%} %> 
     <%} %> 
     <input type="submit" value="sumit" /> 
    <%} %> 

et faire data: $('#formID').serialize() donnent le même résultat que de créer un project l'objet de faire et puis JSON.stringify(project).

+0

Boys est seulement un arraylist et je remplis le tableau comme Boys.Push ($ ('# tex1'). Val()) et il n'a aucune propriété. – learning

+0

@user Omar dit que vous ne pouvez pas utiliser ArrayList w/modèle de liaison. Si vous voulez simplement une liste de chaînes (ce qui est ce que cela ressemble à moi), alors vous pouvez POST une chaîne séparée par des virgules et le diviser côté serveur. – Ryan

+0

Merci Omar, j'ai toujours du mal. En fait, je dois faire un modèle de liaison de tableaux en utilisant javascript et la partie difficile est que j'ai 5 - 6 tableaux et je ne sais pas comment procéder. – learning