2009-03-19 13 views
3

Il peut y avoir une façon plus simple de faire cela et je suis tout ouïe s'il y a. Ma situation est que j'ai une liste déroulante sur un formulaire que je remplis avec succès avec du texte et des valeurs. J'ai également besoin de valeurs de chaînes connexes supplémentaires provenant de la même ligne de table dans la table db disponible sur le client. Ainsi, lorsque l'utilisateur sélectionne dans la liste déroulante, ces données connexes sont remplies dans une zone de texte sur le formulaire. Il n'y a que 4 enregistrements auxquels je suis confronté, donc stocker sur le client n'est pas une grosse affaire. J'ai pensé à transmettre ces données via ViewData sous la forme d'une liste et de les charger dans un tableau javascript. Lorsque l'utilisateur sélectionne dans la liste déroulante - je voudrais déterminer l'index sélectionné et obtenir les données connexes dont j'ai besoin de la matrice. J'utilise déjà la valeur de l'élément de liste déroulante pour les autres données requises, donc j'ai besoin d'un moyen d'obtenir ces données connexes sans faire un aller-retour au serveur. Si je suis sur la bonne voie, quelqu'un pourrait-il publier un exemple simple de remplissage d'un tableau js avec des valeurs sting retournées sous la forme d'une liste dans ViewData.Besoin d'un exemple simple de la façon de remplir un tableau javascript à partir de la liste Viewdata

Merci,

Mike

Répondre

7
var myArray = [ 
<% foreach (string item in ViewData["list"] as List<string>) { %> 
"<%= item %>", 
<% } %> 
]; 

Avoir une virgule à la fin sera aurait briser dans IE, je vous conseille donc une vue méthode d'assistance d'extension pour rendre le code plus facile à gérer:

<%= Html.JavaScriptArray(ViewData["list"] as List<string>, "myArray") %> 

Mettre cette méthode d'aide quelque part en vous solution:

public static string JavaScriptArray(this HtmlHelper htmlHelper, IList<string> values, string varName) { 
    StringBuilder sb = new StringBuilder("var "); 
    sb.append(varName); 
    sb.append(" = ["); 
    for (int i = 0; i < values.Count; i++) { 
     sb.append("'"); 
     sb.append(values[i]); 
     sb.append("'"); 
     sb.append(i == values.Count - 1 ? "\n" : ",\n"); // Not the prettiest but it works... 
    } 
    sb.append("];"); 
    return sb.toString(); 
} 

Techniquement, la méthode d'extension peut aller n'importe où, vous aurez juste besoin d'inclure l'espace de noms dans votre fichier .aspx. Pratiquement de son mieux pour les garder dans des classes séparées logiquement, comme MyApp.Mvc.Extensions.JavaScriptExtensions, MyApp.Mvc.Extensions.LinkExtensions

+0

Merci - qui ressemble à ce que je vais avoir besoin. Où précisément la méthode d'assistance irait dans ma solution? – MikeD

+0

Techniquement cela peut aller n'importe où, vous aurez juste besoin d'inclure l'espace de noms dans votre fichier .aspx. Pratiquement son meilleur pour les garder dans des classes séparées logiquement, telles que MyApp.Mvc.Extensions.JavaScriptExtensions, MyApp.Mvc.Extensions.LinkExtensions – roryf

+0

Une virgule à la fin ne fonctionnera pas dans IE – JeremyWeir

1

... Que diriez-vous

<%= new System.Web.Script.Serialization.JavaScriptSerializer().Serialize(ViewData["list"]) %> 
+0

J'aime cette idée, seulement elle ne produira pas 'var myArray =', mais elle pourrait facilement être combinée avec mon assistant d'extension Html. – roryf

+0

Oui, ce n'est pas un exemple complet, j'ai pensé que vous pourriez remplir les espaces – JeremyWeir