2009-02-16 16 views
22

J'ai créé une API SCORM pour notre système de gestion de l'apprentissage (LMS) et j'utilise pour le moment des variables codées en dur, userID et courseID (variables qui référencent des choses dans la base de données). Je dois passer le vrai userID et le coursID au lieu d'utiliser ceux codés en dur. Je sais que l'ID utilisateur est stocké dans la session et que l'ID courseID est transmis à partir de la page de lancement.Comment donner des variables JavaScript à partir de variables ASP.NET?

Comment les obtenir en JavaScript pour les inclure dans mes appels au fichier .ashx qui gère les appels SCORM?

Répondre

40

Probablement meilleur plus facile de les exposer en tant que propriétés de votre page (ou page maître si utilisé sur chaque page) et de les référencer via des directives page. Ensuite, définissez les valeurs sur Page_Load (ou dans le PageLoad de la page maître).

public void Page_Load(object source, EventArgs e) 
    { 

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

N'oubliez pas que la chaîne Javascript incorporée doit être échappée, sinon des barres obliques, des guillemets et autres dans la chaîne vous briseront Javascript du côté client. – andynormancx

+2

@andynormancx - noté, mais il est raisonnablement probable qu'un champ d'identification va être une valeur numérique et ne pas être un problème. – tvanfosson

+3

La plupart des identifiants d'utilisateur dans les systèmes avec lesquels je traite sont des chaînes qui sont entrées par sysadmin. C'est pourquoi le nom o'brien fait un très bon test.Il est généralement préférable d'être sur la défensive et de ne pas supposer que les variables que vous incorporez ne sont pas des chaînes Javascript sûres. – andynormancx

4

This article décrit la solution la plus pragmatique plusieurs solutions pragmatiques à votre problème.

+0

Pas clair pour moi pourquoi cette solution est la plus "pragmatique". Cela semble trop complexe en fonction de ce dont il a besoin. – nshaw

+0

Bon point - J'ai édité ma réponse pour mieux refléter le contenu de l'article –

+0

Aucun d'entre eux semble traiter des problèmes d'échappement de l'incorporation d'une chaîne Javascript avec des données de chaîne arbitraires. – andynormancx

0

Je ne suis pas sûr de fichiers SCORM ou .ashx (pas d'expérience là-bas) mais pour autant que les valeurs de ASP.NET obtenir vous pouvez faire toutes sortes de choses comme

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

à partir de votre ASP. Page NET. Il y a plusieurs manières d'accomplir ceci mais le résultat final est que la page d'ASP.NET rend les valeurs de la variable dans le HTML (ou le Javascript) qui est envoyé au navigateur.

Ceci est une réponse générique ASP.NET et JavaScript, il peut y avoir une solution plus élégante pour vous.

0

Vous pouvez également utiliser les cookies HTTP. Cette approche est intéressante si vous devez également transmettre des valeurs dans l'autre direction.

7

Toutes les réponses ici qui suggèrent quelque chose comme

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

sont tous absents quelque chose d'important si la variable que vous embedded peut contenir des données de chaînes arbitraires. Les données de chaîne incorporées doivent être échappées de sorte que si elles contiennent des barres obliques inverses, des guillemets ou des caractères non imprimables, elles n'entraînent pas d'erreur Javascript.

Rick Strahl a quelques suggestions pour le code d'échappement nécessaire here. En utilisant le code de Rick la variable intégrée ressemblera à ceci:

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

Notez qu'il n'y a pas de citations maintenant, le code de Rick enveloppe la chaîne échappée avec des guillemets.

+0

Certaines personnes peuvent vouloir que ce travail soit effectué par le client plutôt que sur le serveur. Quoi qu'il en soit, il est important de souligner qu'une fois que vous obtenez les données là où vous le voulez, elles doivent être nettoyées, analysées et non pas consommées instantanément. –

+4

Huh? Comment cela est-il possible à ce travail sur le client? Le texte doit être échappé avant de pouvoir être incorporé dans la variable javascript. – andynormancx

3

Voici les étapes que vous devrez prendre:

Dans votre code behind:

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

set { _userId = value;} 
} 

Étape 2: fonction de vos besoins maintenant, vous devez configurer ces propriétés. Le problème est que ces propriétés doivent être définies avant d'être référencées à partir du JavaScript.Peut-être quelque chose comme ça en cas Page_Load:

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

Bien sûr, vous pouvez les analyser à des types appropriés en fonction de vos besoins.

Enfin, vous pouvez les référencer en JavaScript comme suit:

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

Cela devrait certainement travailler. J'ai utilisé cette approche plusieurs fois.

0

Je suis en train de faire la même chose. Je ne fais que passer les valeurs dont j'ai besoin à l'initialisation et dans le constructeur de l'objet API. Je n'ai vu aucune exigence quant à la façon dont l'objet API peut être créé, juste comment il se trouve dans le code SCO.

7

@tvanfosson's answer C'est ce que j'ai fait normalement dans le passé, mais j'essayais juste de penser à quelque chose d'un peu plus élégant. Je pensais que je lancerais ça.

Vous pouvez configurer un Hashtable dans le codebehind et initialiser une JavaScriptSerializer:

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

Ensuite, définir des variables comme ceci:

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

Puis sérialiser les variables en JavaScript dans votre page:

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

Cela garantit que toutes les variables sont correctement e scaped et minimise également le code si vous avez besoin de travailler avec beaucoup de variables.

1

Dans Passing .NET Server-Side Data to JavaScript, je liste diverses approches, y compris:

  1. Récupération des données par Faire une demande AJAX
  2. Chargement de données à travers un JavaScript externe fichier
  3. Ouverture d'une connexion persistante avec SignalR
  4. Fixation Données vers des éléments HTML
  5. Affectation directe de données à une variable JavaScript
  6. Sérialisation d'un objet .NET dans un littéral JavaScript
Questions connexes