2009-03-11 1 views
4

Zunächst einmal, ich bin ziemlich neu in MVC und jQuery. Ich entschuldige mich, wenn meine Frage oder Terminologie falsch ist.Wie durch Objekte in ViewData über Javascript auf der Seite/Ansicht zu iterieren?

Ich habe derzeit eine Ansicht in meiner MVC-Anwendung, die eine Liste von Adressen anzeigt. Auf der gleichen Seite habe ich auch eine Karte, wo ich diese Orte zuordnen möchte.

Ich versuche, den "richtigen" Weg zu finden, die Liste der Adressobjekte auf das Javascript in der Ansicht zu bekommen, so dass es durchlaufen und zugeordnet werden kann.

Ich habe einige Lösungen gesehen, die einen getJSON-Aufruf an den Controller aus dem JavaScript-Code erfordern. Ich möchte diese Lösung vermeiden, da sie eine weitere Reise zur Datenbank und zum Webserver erfordert. Alle Informationen, die ich benötige, um die Adressen auf der Karte zu rendern, werden bereits über ViewData der View angezeigt.

Ich habe auch eine Lösung gesehen, in der das Javascript auf die Daten zugreifen konnte, die über ViewModel.Data in die Ansicht gelangten, aber dieses Beispiel arbeitete an einem einzelnen Objekt, im Gegensatz zu einer Liste.

Ich würde es schätzen, wenn jemand irgendwelche Tipps oder Ressourcen zur Verfügung hätte.

Dank

Antwort

5

Rendern Sie einfach die Daten in Ihr Javascript. Sagen Sie bitte eine Liste von Adressobjekten wie dieses:

public class Address 
{ 
    public string Line1 { get; set; } 
    public string City { get; set; } 
} 

// in your controller code 
ViewData["Addresses"] = new List<Address>(new Address[] { new Address() { Line1="bla", City="somewhere"}, new Address() {Line1="foo", City="somewhereelse"}}); 

es in Ihrem Javascript, wie diese Render:

<script type="text/javascript"> 
var addresses = new Array(
<% for (int i = 0; i < ViewData["Addresses"].Count; i++) { %> 
<%= i > 0 : "," : "" %>({line1:"<%= addr.Line1 %>", city:"<%= addr.City %>"}) 
<% } %>); 
</script> 

Diese im Grunde erstellt eine JSON formatiert Array mit Ihrer Adresse Objekte in Javascript.

UPDATE: Wenn Sie dies automatisch mithilfe des Framework-Codes tun möchten, statt Ihren eigenen Code zu schreiben, um ihn in JSON zu serialisieren, werfen Sie einen Blick auf den JavaScriptSerializer. Hier ist ein Howto von dem großartigen ScottGu: Tip/Trick: Building a ToJSON() Extension Method using .NET 3.5

+0

Diese ToJSON-Methode hat perfekt funktioniert.Ich erkannte/entdeckte, dass ich das Objekt in Javascript eval() evaporieren musste, um die Zeichenkette wieder in Objekte umzuwandeln. Danke für Ihre Hilfe! – adamisnt

1

Sie die Daten in JSON auf dem Server (als String) formatiert werden könnten. Ordnen Sie dies Ihren ViewData zu. Ordnen Sie in Ihrer View die ViewData einer JavaScript-Variablen zu.

<script type="text/javascrpt"> 
    var objList = <%= ViewData["objectListJSON"]; %>; 

    for (var obj in objList) 
    { 
    ... 
    } 
</script> 
+0

Große - I werde ich es versuchen. Zuvor ist eine SomeList.toJSON-Methode im Framework verfügbar? – adamisnt

+0

Ich hatte Probleme mit JsonResult. Wie auch immer, dein Post hat mich in die richtige Richtung gebracht. Am Ende habe ich die ToJSON() Extension-Methode verwendet, auf die Chris Hynes in seiner Antwort hingewiesen hat. Vielen Dank für Ihre Hilfe – adamisnt

+0

Folgendes: http://stackoverflow.com/questions/3331842/asp-net-mvc-pass-json-string-to-view-using-viewdata erklärt, warum JsonResult nicht für diese Situation verwendet werden kann. – cweston

2

Technisch gesehen ist ViewData nicht Render zu Ausgabe HTMl wird also nicht an Client-Browser gesendet werden. Die einzige Möglichkeit, auf Bildschirmtextsystem zugreifen können, ist es in der HTML-wie-Array zu einem Objekt machen oder so etwas wie:

var cityList = new Array(); 
function addCity(cityId, cityName) { 
    var city = new Object(); 
    city.CityID = cityId; 
    city.CityName = cityName 

    cityList .push(city); 
} 
<% foreach (Something.DB.City item in ViewData["Cities"] as List<City>) 
    { %> 
    addCity(item.Id, item.Name); 
<% } %> 

Dies ist so, wie ich in der Regel, wenn ich Daten für Javascript machen müssen

+0

Dies ist eine falsche Terminologie. "Nicht an einen Client-Browser gesendet werden" kann verwirrend sein. "Der einzige Weg, auf den Sie auf ViewData zugreifen können" ist auch ein wenig verwirrend. ViewData ist ein Wörterbuch von Objekten, das an eine View übergeben wird. Es kann ein Objekt enthalten, das Markup enthält. Es ist nicht empfehlenswert, Markup in die Steuerungslogik aufzunehmen. Ich glaube, was vom Kommentator beabsichtigt wurde, ist, dass dieses Wörterbuch verwendet werden kann, um Display-Inhalte zu erstellen, aber bietet keine Display-Markup von selbst. –

Verwandte Themen