2009-03-19 2 views
3

Bestücken kann Es kann eine einfachere Möglichkeit, dies zu tun, und ich bin ganz Ohr wenn es ist. Meine Situation ist, dass ich eine Dropdown-Liste auf einem Formular habe, das ich erfolgreich mit Text und Werten bevölkert habe. Ich muss auch zusätzliche verwandte Zeichenfolgenwerte aus derselben Tabellenzeile in der db-Tabelle, die auf dem Client verfügbar ist, haben, wenn der Benutzer aus dem Dropdown wählt, werden diese verwandten Daten in einem Textfeld in dem Formular aufgefüllt. Es gibt nur 4 Datensätze, mit denen ich es zu tun habe, also ist das Speichern auf dem Client keine große Sache. Ich dachte daran, diese Daten über ViewData als Liste zu übergeben und in ein Javascript-Array zu laden. Wenn der Benutzer aus der Dropdown-Liste auswählt, würde ich den ausgewählten Index bestimmen und die benötigten Daten aus dem Array abrufen. Ich benutze bereits den Wert des Dropdown-Elements für andere erforderliche Daten, also brauche ich eine Möglichkeit, diese verwandten Daten zu erhalten, ohne eine Rückfahrt zum Server zu machen. Wenn ich auf der richtigen Spur bin, könnte jemand ein einfaches Beispiel für das Auffüllen eines js-Arrays mit Stichwerten eingeben, die als Liste in den ViewData zurückgegeben werden.Benötigen Sie ein einfaches Beispiel, wie Javascript Array aus Viewdata Liste

Danke,

Mike

Antwort

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

ein Komma am Ende angeblich in IE brechen, so würde ich eine Blick Verlängerung Hilfsmethode vorschlagen, den Code leichter zu verwalten:

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

diese Hilfsmethode irgendwo in Ihnen Lösung:

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(); 
} 

Technisch kann die Erweiterungsmethode überall gehen, Sie müssen nur den Namespace in Ihre ASPX-Datei aufnehmen. Praktisch seine besten sie in logisch getrennte Klassen zu halten, wie MyApp.Mvc.Extensions.JavaScriptExtensions, MyApp.Mvc.Extensions.LinkExtensions

+0

Dank - das wie das, was aussieht werde ich brauchen. Wo genau würde die Helfermethode in meine Lösung gehen? – MikeD

+0

Technisch kann es überall hingehen, Sie müssen nur den Namespace in Ihre ASPX-Datei einfügen. Praktisch ist es am besten, sie in logisch getrennten Klassen zu halten, wie MyApp.Mvc.Extensions.JavaScriptExtensions, MyApp.Mvc.Extensions.LinkExtensions – roryf

+0

Ein Komma am Ende wird nicht funktionieren in IE – JeremyWeir

1

wie etwa ...

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

Ich mag diese Idee, nur wird es nicht ausgeben 'var myArray =', aber es könnte leicht mit meinem HTML-Erweiterung Helfer kombiniert werden. – roryf

+0

Ja, es ist kein vollständiges Beispiel, ich dachte, Sie könnten die Lücken ausfüllen – JeremyWeir

Verwandte Themen