2009-07-28 3 views
33

Ich habe in letzter Zeit mit ASP.NET MVC und Javascript/jQuery viel gearbeitet und ich scheinen in eine Richtung zu gehen, in der ich immer passieren muss etwas dynamischer Wert "zu" meinem Javascript. Wenn das Skript direkt in der Seite ist, habe ich so etwas getan:Best Practices für die Weitergabe von Daten von asp.net-mvc zu Javascript

var isEditable = <%=ViewData["editable"]%> 

Ich mag, wie das ist schnell & einfach und genau wie ich einen Wert in HTML injizieren würde. Aber das riecht. Wirklich, wirklich schlimm. Und es unterbricht Visual Studio's Intellisense- und Code-Formatierung, wodurch meine Skripte schwer zu lesen und zu verstehen sind.

Es hat mir einfiel andere Lösung wäre, um meine Daten zu einem versteckten Feld zu passieren, und haben die Javascript-Referenz, die ...

<input type="hidden" id="editable" value="<%=ViewData["editable"]%>" /> 
var isEditable = $("#editable").attr("value"); 

Dies ist wahrscheinlich viel besser als es das Skript intakt hält und würde es mir erlauben, es in eine externe .js-Datei zu verschieben. Aber etwas an dieser Lösung scheint auch nicht ideal zu sein. Oder ist es nur ich?

Kann jemand empfehlen Lösungen & Best Practices für die Weitergabe von Daten in Ihre Skripts? Gehe ich auf den falschen Weg, wenn meine Skripts in erster Linie die Viewdaten von meinen Controllern verlassen?

+1

Wie wäre es mit Daten aus dem Modell in eine Art von Datenspeicher in der Steuerung mit AJAX "ziehen"? – Janie

+1

Ich denke, AJAX wäre in der Art von Fällen, die ich beziehe, zu viel ... Meine Skripte müssen in der Regel nur ein paar Daten vom Controller/Modell (Daten, die bereits auf der ersten Seite Ausführung vorhanden ist) so wissen um einen anderen Netzwerk-Call-Back einen Controller auszugeben scheint ein bisschen viel. –

Antwort

11

ich manchmal Daten auf meine Seiten übergeben, indem Sie ein Config Objekt auf der Seite über einen JSON Serializer schreiben:

var pageConfig = <%= ServerConfig.ToJson() %>; 

, wo Sie die toJSON Methode selbst schreiben müssen. Dadurch bleibt der Seitenstatus gut erhalten, sodass nur ein Platz für die Serverwerte zur Verfügung steht. Alles von jetzt an ist reines Javascript. In Ihrem Beispiel könnten Sie dann tun:

var isEditable = pageConfig.isEditable; 

auch in einer externen js-Datei, wenn pageConfig global sind. In diesem Fall sollten Sie ihn jedoch mit einem Namespace versehen: MY_APP.pageConfig vielleicht.

+0

Beeinträchtigt dies nicht die Chakeability?Zumindest jede Seite GET kann eine andere Seite zurückgeben (andere Konfiguration). Wenn Sie in Caches auf Proxyservern denken, haben Sie jetzt für jeden Benutzer eine andere Version dieser Seite. Ist das überhaupt ein Problem? –

+0

Dies ist eine faszinierende Option, aber ich bin mir nicht sicher, ob ich genau verstehe, wie Sie diese ServerConfig-Klasse implementieren. In der Tat kann jede Seite GET einen anderen Satz von Daten zurückgeben, würde also nicht unbedingt pageConfig aus den ViewData jeder Seite gesetzt werden müssen? Wie auch immer, deine anderen Vorschläge sind etwas, das ich definitiv versuchen werde (Json und eine globale js-Variable) - danke! –

+0

@Kurt - yeah, ich denke, Sie müssten es aus ViewData erstellen (vielleicht als anonymer Typ). Ich wollte nicht, dass Sie ViewData loswerden, sondern dass Sie die Anzahl der Stellen beschränken können, an denen Sie Serverdaten auf die Seite injizieren. –

0

Sie werden diese Informationen auf die eine oder andere Weise injizieren. Und IMO, dein erstes Beispiel unterscheidet sich nicht wirklich von dem zweiten.

Eine andere Lösung besteht darin, eine JS-Klasse (oder einen Prototyp?) Zu haben, die ein Optionsobjekt akzeptiert. Es ist zugegebenermaßen nicht wirklich anders als die Beispiele, die Sie gegeben haben. Aber trotzdem, vielleicht würdest du diesen Weg gehen wollen.

$(function() { 
    myClass.init({ isEditable: <%=ViewData["editable"]%>, 
     another: '<%=ViewData["another"]%>' }); 
}); 
0

Ich denke, @ çağdaş macht einen guten Punkt, aber denken Sie daran, Server-Seite zu überprüfen. Wenn Sie ein Feld auf "Nur lesen" setzen, gibt es nichts, was den Benutzer daran hindert, dieses Flag zu ändern, ein schreibgeschütztes Feld zu ändern und zu senden.

0

Das gesamte Geschäft von Ajax ist zu laden Informationen asynchron. Wenn Sie den Job von Ajax machen (die Informationen laden und in einer Variablen belassen), nimmt das Macht davon. Warum probieren Sie JQuery nicht aus und verwenden Sie Ajax oder Get-Funktionen, um den Inhalt dynamisch zu laden? Es würde Ihre Seite schneller laden.

Verwandte Themen