2013-02-18 1 views
0

J'ai un petit problème. Je veux avoir une liste déroulante avec certains objets. Après avoir cliqué sur un, je veux l'ajouter à la liste avec textfield pour le nommer. Je ne veux pas limiter la quantité de ces champs. Je veux recevoir l'ID du contrôleur (enregistré dans la liste déroulante) et le nom (donné par l'utilisateur) pour chaque élément sélectionné. Comment puis-je le faire? Je pensais à le stocker dans certains champs sous forme de texte, et à analyser le cotroller mais je pense que ce n'est pas élégant.Formulaire dynamique dans ASP.NET MVC3 Razor

EDIT. Ok, Thansk pour votre aide, mais ça ne fonctionne pas correctement pour moi. je produis html comme ceci:

<input type="hidden" value="96" name="Inputs[0].Key"> 
<input type="text" name="Inputs[0].Value"> 

Dans mon contrôleur je reçois ce dictionnaire. Le problème est que la quantité d'éléments est correcte, mais toutes les valeurs sont nulles. Quel est le problème ici?

+0

Réponse pour votre modification: Si vous utilisez exactement le code que vous avez posté, il vous manque des balises de fermeture pour la saisie. Vous devriez faire comme ceci: '' ou ceci '' –

Répondre

1

Utilisez IEnumerable<KeyPairValue<string,string>> MySelectedItem = new List<KeyPairValue<string,string>>(); le modèle, et lors de l'ajout à la liste, le nom comme un tableau:

MySelectedItem[1].Key, MySelectedItem[1].Value, MySelectedItem[2].Key... 

(je ne l'ai pas testé, mais il devrait fonctionner)

Edit: vérification sur ce blog avec une meilleure explication sur la façon de le faire: http://haacked.com/archive/2008/10/23/model-binding-to-a-list.aspx

+0

Réponse pour votre modification: Si vous utilisez exactement le code que vous avez posté, il vous manque des balises de fermeture pour la saisie. Vous devriez faire comme ceci: '' ou ceci '' –

1

La meilleure façon d'y parvenir est d'utiliser la liaison de modèle de style tableau. Donc, pour chaque élément que vous souhaitez nommer, créez un champ caché pour stocker la valeur déroulante plus un champ de texte pour stocker le nom donné par l'utilisateur. Vous les nommez comme suit:

<input type="hidden" name="element[0].Key" /><input type="text" name="name[0].Value" /> 

en augmentant la valeur d'index chaque fois. Ceci est facilement réalisé avec un peu de JavaScript. Vous créez ensuite une méthode d'action qui prend un KeyValuePair<string, string>[] en tant que paramètre. Vous pourrez alors analyser vos valeurs sans problème avec une boucle ou une expression LINQ.