2009-05-05 7 views
0

J'utilise .NET 3.5, MVC.ASP.NET - Alias ​​noms de liste déroulante sur back end

Je souhaite utiliser un ensemble d'alias de chaîne pour représenter les valeurs de base de données. c'est-à-dire lorsqu'un utilisateur sélectionne une option dans une liste déroulante, il définit en fait la valeur 0, 1, 2, etc. dans la table, plutôt que le texte affiché dans la liste déroulante elle-même.

par exemple. Je fais:

IdName[] Thing = new[] { 
new IdName { Id = 0, Name = "No Selection" }, 
new IdName { Id = 1, Name = "Thing A9" }, 
new IdName { Id = 2, Name = "Thing C12" }, 
new IdName { Id = 3, Name = "Thing F4" } 
}; 

MyDropDownList = new SelectList(Things, "Id", "Name",0); 

et dans la vue:

<%= Html.DropDownList("MyDropDownList")%> 

Maintenant, cela fonctionne très bien. Ce que je n'arrive pas à faire, c'est afficher la valeur du champ dans une vue 'détails' et montrer "Thing C12" comme texte au lieu de "2".

Aussi, est-ce la meilleure façon de procéder? Je ne veux pas utiliser la chaîne dans la base de données au cas où je modifierais le texte d'une entrée (par exemple, changer le nom de "Thing F4" en "Thing F5".) Je suis totalement ouvert à d'autres idées.

Merci!

+0

vous avez dit: montrant "Thing C12" comme le texte au lieu de "2" où? –

+0

Ce que je veux dire, quand un utilisateur sélectionne "Thing C12" de la liste déroulante, il stocke effectivement la valeur dans la base de données en tant que 2 (en raison de la façon dont j'ai appelé SelectList()) – user101306

+0

ok je reçois le point –

Répondre

1

Vous voulez donc que votre méthode d'action (qui stockera le choix de l'utilisateur) stocke la valeur plutôt que l'alias affiché dans la liste déroulante.

Je pense que vous avez deux options ici.

1- Côté serveur, récupérez la valeur (l'identifiant) de votre source de données, par exemple: le tableau Things [] dans votre exemple.

public ActionResult StoreValueFromDropDown(string MyDropDownList) { 
     var id = Things.Single(thing => thing.Name == MyDropDownList).Id; 
     // here goes the code to sotre the id 
} 

2- côté client en ajoutant un champ caché qui stocke la valeur de la liste déroulante. ici est un exemple en utilisant jQuery (je ne l'ai pas le tester):

<input type="hidden" id="ThingId" /> 

,

$('#MyDropDownList').change(function(e){ 
    $('#ThingId').value($('#MyDropDownList option:selected').attr('value')); 
}); 

alors vous devez modifier votre méthode d'action pour accepter la valeur de ce champ caché

public ActionResult StoreValueFromDropDown(int ThingId) { 

     // here goes the code to sotre the id 
} 
+0

Je stocke la valeur dans la base de données sans problème - elle récupérait la valeur et la traduisait en texte qui était le problème. J'ai réussi à résoudre mon problème en créant un contrôleur de vue personnalisé et en ajoutant une méthode pour effectuer une recherche dans la liste 'Thing' en utilisant la valeur trouvée dans l'enregistrement de base de données. Maintenant, mon problème est que je vais devoir créer beaucoup de méthodes spécifiques au champ comme celui-ci (avec un tas de listes 'Thing') et j'imagine qu'il y a une meilleure façon de le faire pour s'assurer que les choses sont moins spécifiques au modèle. Néanmoins, merci pour votre aide. – user101306

+0

Je pense que ce problème peut être plus général. J'ai essayé de simplifier et n'ai pas obtenu de meilleurs résultats. J'ai commencé une autre question pour essayer de comprendre cela. – user101306

Questions connexes