Comment puis-je ajouter des lignes à une liste de collection dans mon Modèle?
Par souci de simplicité, disons que j'ai un User
modèle qui dispose d'un List<Email>
comme l'une de ses propriétés.
public class UserModel
{
public string UserName { get; set; }
public List<Email> Emails = new List<Email>();
}
public class Email
{
public string Address { get; set; }
}
De mon point de vue, j'ai une liste d'e-mails:
<table>
@foreach(Email email in Model.Emails)
{
<tr>
<td>@Html.EditorFor(modelItem => email.Address)</td>
</tr>
}
</table>
Maintenant, disons que je veux que l'utilisateur puisse cliquer sur un bouton qui ajoute une nouvelle ligne à la table, de sorte que l'utilisateur peut ajouter un nouvel e-Mail à la Liste qui est lié à leur Utilisateur. Comment dois-je faire? Ai-je besoin d'ajouter la nouvelle ligne via javascript, d'une certaine façon afin qu'il soit lié au modèle lorsque la page est affichée? Je n'ai aucune idée de comment l'approche de ce que je suis relativement nouveau à MVC venant de WebForms.
De liaison pour le modèle moyen de l'élément de formulaire ayant le même nom. Mais le type a besoin pour être en mesure d'être jumelés.
OriginalL'auteur Bryan Denny | 2012-03-28
Vous devez vous connecter pour publier un commentaire.
Après quelques recherches, j'ai trouvé ce blog par Steven Anderson http://blog.stevensanderson.com/2010/01/28/editing-a-variable-length-list-aspnet-mvc-2-style/
Il semble être en train de faire exactement ce que je veux (sauf qu'il est écrit dans MVC2).
OriginalL'auteur Bryan Denny
C'est un de ces endroits où MVC et web forms considérablement diverger.
Si je faisais cela, j'utilise AJAX pour présenter la nouvelle adresse e-mail et retourner un objet JSON ou de la table des e-mails rendu qu'une Vue Partielle. De cette façon, vous n'avez pas à recharger la page entière. Voici l'exemple et qui retourne le code HTML à partir de l'appel AJAX, à l'aide de jQuery parce que je ne suis pas un fan de la MVC du natif des fonctionnalités AJAX.
Point De Vue Original:
Vue Partielle: EmailTable
Action De Contrôleur: AddEmail
jQuery pour gérer le clic sur le bouton
OriginalL'auteur devstruck
Je voudrais utiliser une méthode d'extension au lieu que vous pouvez utiliser dans d'autres cas:
Extension:
Ajouter une propriété de le modèle, ce qui le EditorForMany helper va stocker l'index généré. Sans cela, le Html.Validation* méthodes ne fonctionnent pas (voir ici pour une plongée dans le “pourquoi” pour les curieux).
Substitut @Html.EditorFor(modelItem => e-mail.L'adresse):
(Note: Si vous n'êtes pas dans un
<tr>, <tbody> or <ul>
ou similaire le code de @Html.EditorForMany(x => x.E-mails, x => x.L'indice) et vous n'aurait pas besoin d' @Html.EditorForManyIndexField(x => x.E-mails, x => x.Index) ou @Html.EditorForManyIndexField(x => x.L'indice). Sans paramètre Indexfield vous-même votre table serait mal formaté et donc on fait comme ceci.)Désormais, tous nos problèmes sont résolus! Vous verrez que Html.EditorForMany() utilise le Guid plutôt que des numéros d'index. Cela supprime la nécessité pour nous de dire à nos AJAX d'extrémité index qui a été utilisé, comme notre AJAX point de terminaison au lieu de cela il vous suffit de créer un nouveau GUID. Html.EditorForMany() prend également soin de façon transparente la production de la .Champ d'Index pour nous.
Tout ce qui reste à faire est d'obtenir notre AJAX d'extrémité et en cours d'exécution. Pour ce faire, j'définir une nouvelle action dans mon Contrôleur.
Créer une nouvelle vue Vues\Shared\AddEmail.cshml;
Bravo à Matt pour origine l'article
OriginalL'auteur Ogglas
Première, votre modèle de définition des besoins de quelques ajustements:
Ensuite, ce que vous pouvez faire est (pas sûr sur votre table de mise en œuvre) affichage de la liste des e-mails, et ensuite une forme de section poster un nouvel e-mail à ajouter:
Si vous souhaitez avoir un utilisateur de cliquer sur un bouton pour ajouter une nouvelle ligne d'entrée une fois que le mail est entré puis qui ont à faire avec javascript/jquery parce qu'elle est dynamique. La réponse de post_erasmus a une bonne suggestion pour une approche plus dynamique en utilisant ajax.
OriginalL'auteur Travis J
Avez-vous songé à l'aide d'un tiers des outils pour cela?
J'ai trouvé ceci sur CodeProject et semble répondre à vos exigences. Oui il va me falloir un peu de peaufinage, mais il devrait faire le travail
http://www.codeproject.com/Articles/277576/AJAX-based-CRUD-tables-using-ASP-NET-MVC-3-and-jTa
Sinon, vous pouvez passer des heures sur la mise en œuvre des fonctionnalités similaires en JavaScript/jQuery.
OriginalL'auteur