2010-02-11 4 views
2

J'ai essayé plusieurs fois au cours des dernières semaines d'obtenir une vue MVC 2 côté serveur pour travailler avec des objets avec des éléments IList imbriqués sans grand succès. Il me manque une compréhension fondamentale que j'espère que cette question résout. Ce que je veux est un formulaire qui montre une liste de produits où vous pouvez changer les informations en ligne, y compris une hiérarchie (une liste de produits qui ont chacun une liste de sous-produits, qui ont chacun une liste d'images , etc.) J'essaie de recréer un formulaire MS Access plus ancien où la grande forme a une liste de produits et de sous-formulaires montrant les produits connexes, tous permettant des modifications en ligne. Access enregistre chaque enregistrement en se concentrant sur un enregistrement différent.ASP.NET MVC 2: A quoi ressemble la vue C# qui édite les entités imbriquées?

Supposons que vous avez un modèle de domaine qui ressemble à ceci:

public class Product { 
    ... // Lots of fields like public string name {get; set;} 
    public IList<Department> departments {get; set;} 
    public IList<SubProduct> subProducts {get; set;} 
} 
public class SubProduct { 
    ... // Lots of fields like public string name {get; set;} 
    public IList<Image> images {get; set;} 
} 
public class Image { 
    ... // Lots of fields like public string name {get; set;} 
} 

et un modèle de vue qui ressemble à ceci:

public class EditProduct { 
    IList<Product> products {get; set;} 
} 

Dans la vue MVC 2, comment coder vous Edit champs afin que vous puissiez poster le modèle unique au contrôleur? Je connais le

<input id="products[0].subProducts[0].images[0].name" /... > 

mécanicien, mais chaque IList a besoin d'un chemin vers les éléments CRUD sur le même écran. C'est un grand écran de saisie de données où la vitesse compte autant que la possibilité de voir tous les produits dans une liste. J'ai besoin de boutons Ajouter, de boutons Supprimer et d'un moyen pour publier le formulaire entier après avoir modifié les entrées.

Si je regarde d'un point de vue JQuery:

  • Je sérialiser le modèle JSON pour la forme initiale du premier numéro de N d'éléments IList
  • je charge à la volée des produits supplémentaires dans la même liste quand ils atteignent le fond du conteneur div
  • J'accepte le modèle entier lors de la sauvegarde/publication ou accepte des pièces du même formulaire pour des entités individuelles, comme avoir une étiquette de formulaire html distincte pour chaque élément IList

Mais pour une raison quelconque, je ne comprends pas comment faire cela du côté serveur. Tous les liens ou exemple de code pour la vue elle-même serait génial. Les éléments sans IList semblent bien fonctionner, en particulier avec les modèles d'interface utilisateur. Est-ce que je créerais un tas de balises html individuelles autour de chaque entité modifiable et que les posts traiteraient uniquement d'un élément à la fois?

+0

Est-ce que vous voulez avoir un seul bouton Soumettre pour soumettre toutes les modifications, ou un par chaque ligne ? –

+0

Je veux vraiment avoir un seul bouton de sauvegarde, mais nous aurons besoin d'ajouter pour chaque ensemble IList et Supprimer pour chaque élément IList, ce qui signifie probablement que nous avons une tonne de boutons d'envoi. Tous ces boutons provoquent une sensation de malaise. LOL –

+0

Scott Guthrie a mentionné le nouveau tableau ou collection de gestionnaires EditorFor et DisplayFor. Une réponse pourrait inclure comment les utiliser avec une liste <>. –

Répondre

0
<% for (int count = 0; count < Model.Students.Count; count++) 
    {            %><%= 
     Html.EditorFor(m => m.Students[count])  %><% 
    } 
%> 

crée des noms de forme comme:

name="Students[0].Name" 
name="Students[1].Name" 
name="Students[2].Name" 

qui se lient de nouveau au modèle de vue de la liste originale

Questions connexes