2009-02-16 16 views
22

Ho creato un'API SCORM per il nostro LMS e in questo momento sto usando userID hard coded e variabili courseID (variabili che fanno riferimento a cose nel database). Ho bisogno di passare il vero userID e courseID invece di usare quelli con codice fisso. So che l'ID utente è memorizzato nella sessione e l'ID corso viene passato dalla pagina di avvio.Come posso fornire i dati delle variabili JavaScript dalle variabili ASP.NET?

Come posso ottenere questi in JavaScript così li posso includere nelle mie chiamate al Ashx che gestisce le chiamate SCORM?

risposta

40

Probabilmente migliore è il modo più semplice per esporli come proprietà della pagina (o pagina principale se utilizzata su ogni pagina) e farli riferimento tramite le direttive della pagina.

<script type="text/javascript"> 
    var userID = '<%= UserID %>'; 
    var courseID = '<%= CourseID %>'; 

    .... more stuff.... 
</script> 

Poi impostare i valori su Page_Load (oppure nel Page_Load per la pagina master).

public void Page_Load(object source, EventArgs e) 
    { 

     UserID = Session["userID"]; 
     CourseID = Session["courseID"]; 
     ... 
    } 
+3

Non dimenticare che la stringa Javascript incorporata deve essere sottoposta a escape, altrimenti le barre rovesciate, le virgolette e simili nella stringa interromperanno JavaScript sul lato client. – andynormancx

+2

@andynormancx - annotato, ma è ragionevolmente probabile che un campo ID diventi un valore numerico e non sia un problema. – tvanfosson

+3

Molti degli ID utente nei sistemi con cui ho a che fare sono stringhe che vengono inserite da sysadmin. Ecco perché il nome o'brien è un ottimo test case.Di solito è meglio essere sulla difensiva e non assumere che le variabili che si stanno incorporando non siano una stringa JavaScript sicura. – andynormancx

4

This article descrive la soluzione più pragmatica diverse soluzioni pragmatiche al problema.

+0

Non mi è chiaro perché quella soluzione è la più "pragmatica". Sembra troppo complesso in base a ciò di cui ha bisogno. – nshaw

+0

Buon punto - Ho modificato la mia risposta per riflettere meglio i contenuti dell'articolo –

+0

Nessuno di essi sembra affrontare i problemi di escape di incorporare una stringa Javascript con dati stringa arbitrari. – andynormancx

0

Non sono sicuro sui file .ashx (nessuna esperienza) ci SCORM o ma fino ad ottenere i valori da ASP.NET si può fare ogni sorta di cose come

var xyz = '<%= variable %>'; 

dall'interno ASP. Pagina NET. Esistono vari modi per eseguire ciò, ma il risultato finale è che la pagina ASP.NET restituisce i valori della variabile nell'HTML (o JavaScript) che viene inviato al browser.

Questa è una risposta ASP.NET generica e JavaScript, potrebbe esserci una soluzione più elegante là fuori per voi.

0

È possibile anche utilizzare i cookie HTTP. Questo approccio è piacevole se è necessario passare anche i valori nell'altra direzione.

7

Tutte le risposte qui che suggeriscono qualcosa come

var userID = '<%= UserID %>'; 

sono tutti manca qualcosa di importante se la variabile che si sono integrati può contenere dati stringa arbitraria. I dati di stringa incorporati devono essere sottoposti a escape in modo che se contiene barre rovesciate, virgolette o caratteri non stampabili non causino errori di Javascript.

Rick Strahl ha alcuni suggerimenti per il codice necessario sfuggire here. Utilizzando il codice di Rick la variabile incorporato sarà simile a questa:

var userId = <%= EncodeJsString(UserID) %>; 

Nota che non ci sono citazioni ora, il codice di Rick avvolge la stringa di escape con le citazioni.

+0

Alcune persone potrebbero volere che il lavoro sia svolto dal client piuttosto che sul server. In ogni caso, è importante sottolineare che una volta ottenuti i dati nel punto desiderato, è necessario pulirli, analizzarli, controllarli e non solo consumarli immediatamente. –

+4

Eh? Com'è possibile a questo lavoro sul cliente? Il testo deve essere preceduto da escape prima che possa essere incorporato nella variabile javascript. – andynormancx

3

qui sono i passi che si dovranno prendere:

Nel codice dietro pagina:

private int _userId; 
private int _courseId; 
protected int CourseId 
{ 
    get { return _courseId;} 
    set { _courseId = value;} 
} 
protected int UserId 
{ 
get { return _userId;} 

set { _userId = value;} 
} 

Fase 2: in base vostro requisito ora si deve impostare tali proprietà. Il problema è che queste proprietà dovrebbero essere impostate prima di essere referenziate da JavaScript.Forse qualcosa di simile nel caso Page_Load:

_userId = Session["userId"]; 
_courseId = Request.QueryString["CourseId"] != null ? Request.QueryString["CourseId"] : String.empty; 

Naturalmente si può analizzare loro di tipi appropriati in base alle proprie esigenze.

Infine, è possibile fare riferimento in JavaScript come segue:

var currentUserId = '<% = UserId %>'; 
var currentCouseId = '<% = CourseId %>'; 

Questo dovrebbe sicuramente lavorare. Ho usato questo approccio molte volte.

0

Sono in procinto di fare la stessa cosa. Sto solo passando i valori che potrei aver bisogno al momento dell'inizializzazione e tali nel costruttore dell'oggetto API. Non ho visto alcun requisito su come l'oggetto API possa essere creato, solo come si trova nel codice dello SCO.

7

@tvanfosson's answer è come ho fatto normalmente in passato, ma stavo solo cercando di pensare a qualcosa di un po 'più elegante. Ho pensato di buttarlo qui.

È possibile impostare un HashTable nel codebehind e anche inizializzare un JavaScriptSerializer:

Protected json As New System.Web.Script.Serialization.JavaScriptSerializer 
Protected jsvars As New Hashtable 

Quindi impostare le variabili in questo modo:

jsvars.Add("name", "value") 

Poi serializzare le variabili in JavaScript nella tua pagina:

<script type="text/javascript"> 
    var vars = <%=json.Serialize(jsvars)%>; 
    alert(vars.name); 
</script> 

Ciò garantisce che tutte le variabili siano corrette e scapato e minimizza anche il codice se hai bisogno di lavorare con un sacco di variabili.

1

In Passing .NET Server-Side Data to JavaScript, elenco diversi approcci, tra cui:

  1. Prelevamento dati da Fare una richiesta Ajax
  2. Caricamento dati tramite un JavaScript esterno file
  3. Apertura di una connessione persistente con SignalR
  4. Collegamento Dati sugli elementi HTML
  5. Assegnazione di dati direttamente a una variabile JavaScript
  6. Serializzazione di un oggetto .NET in un JavaScript letterale
Problemi correlati