2009-02-16 10 views
22

He creado una API SCORM para nuestro LMS y ahora estoy usando un ID de usuario y variables de ID de curso (variables que hacen referencia a cosas en la base de datos). Necesito pasar el identificador de usuario real y el ID de curso en lugar de usar los codificados. Sé que el ID de usuario está almacenado en la sesión y el ID de curso se pasa de la página de inicio.¿Cómo proporciono datos de variables de JavaScript de las variables de ASP.NET?

¿Cómo puedo obtener estos en JavaScript para que pueda incluirlos en mis llamadas al .ashx que maneja las llamadas SCORM?

Respuesta

40

Probablemente mejor más fácil de exponerlos como propiedades de su página (o página maestra si se utiliza en cada página) y hacer referencia a ellos a través de directivas de página.

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

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

A continuación, configure los valores en Page_Load (o en la página_carga de la página maestra).

public void Page_Load(object source, EventArgs e) 
    { 

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

No olvide que la cadena de Javascript incrustado debe ser escapada, de lo contrario las barras diagonales inversas, las comillas y elementos similares en la cadena le romperán el Javascript en el lado del cliente. – andynormancx

+2

@andynormancx - notado, pero es razonablemente probable que un campo de id sea un valor numérico y no sea un problema. – tvanfosson

+3

Muchos de los identificadores de usuario en los sistemas con los que trato son cadenas que ingresa sysadmin. Por eso el nombre O'brien es un muy buen caso de prueba.Por lo general, es mejor estar a la defensiva y no asumir que las variables que está incrustando no son Javascript string string. – andynormancx

4

This article describe la solución más pragmática varias soluciones pragmáticas a su problema.

+0

No tengo claro por qué esa solución es la más "pragmática". Parece demasiado complejo en función de lo que necesita. – nshaw

+0

Buen punto - Edité mi respuesta para reflejar mejor los contenidos del artículo –

+0

Ninguno de ellos parece ocuparse de los problemas de escape de incrustar una cadena de Javascript con datos de cadena arbitrarios. – andynormancx

0

No estoy seguro acerca de SCORM o archivos .ashx (sin experiencia allí), pero en cuanto a conseguir los valores de ASP.NET que puedo hacer todo tipo de cosas como

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

desde dentro de su ASP. NET página. Hay varias maneras de lograr esto, pero el resultado final es que la página ASP.NET representa los valores de la variable en el HTML (o JavaScript) que se envía al navegador.

Esta es una respuesta genérica de ASP.NET y JavaScript, puede que exista una solución más elegante para usted.

0

También puede utilizar las cookies HTTP. Ese enfoque es bueno si necesita pasar valores en la otra dirección también.

7

Todas las respuestas aquí que sugieren algo así como

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

están perdiendo algo importante si la variable que está incrustado puede contener datos de cadena arbitrarias. Los datos de cadenas incrustadas deben escaparse para que, si contienen barras invertidas, comillas o caracteres no imprimibles, no causen un error en el código JavaScript.

Rick Strahl tiene algunas sugerencias para el código de escape necesario here. Mediante el código de Rick la variable incorporada, se vería así:

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

Tenga en cuenta que no hay citas de ahora, el código de Rick envuelve la cadena escapada con comillas.

+0

Algunas personas pueden desear que el trabajo lo realice el cliente en lugar de hacerlo en el servidor. De cualquier forma, es importante señalar que una vez que obtenga los datos donde los desea, deberá limpiarlos, analizarlos, inspeccionarlos y no solo consumirlos al instante. –

+4

¿Eh? ¿Cómo es posible que esto funcione en el cliente? El texto debe escaparse para poder incrustarse en la variable javascript. – andynormancx

3

Estos son los pasos que tendrá que tomar:

En su código detrás de la página:

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

set { _userId = value;} 
} 

Paso 2: en base a su requerimiento ahora usted tiene que configurar esas propiedades. El problema es que estas propiedades deben establecerse antes de que se las haga referencia desde JavaScript.Tal vez algo como esto en el caso Page_Load:

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

Por supuesto que se puede analizar a tipos adecuados en función de sus necesidades.

Por último, se puede hacer referencia a ellos en JavaScript de la siguiente manera:

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

Esto definitivamente debe trabajar. He usado este enfoque muchas veces.

0

Estoy en el proceso de hacer lo mismo. Solo estoy pasando los valores que pueda necesitar al inicializarlos y en el constructor del objeto API. No he visto ningún requisito sobre cómo se puede crear el objeto API, solo cómo se encuentra en el código del SCO.

7

@tvanfosson's answer es como normalmente he hecho esto en el pasado, pero estaba tratando de pensar en algo un poco más elegante. Pensé en tirar esto por ahí.

Puede configurar una tabla hash en el código subyacente y también inicializar un JavaScriptSerializer:

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

A continuación, establezca las variables de la siguiente manera:

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

continuación, serializa las variables en JavaScript en su página:

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

Esto asegura que todas las variables son correctamente e Scape y también minimiza el código si necesita trabajar con muchas variables.

1

En Passing .NET Server-Side Data to JavaScript, enumero varios enfoques, incluyendo:

  1. Obtención de datos por Cómo hacer una petición Ajax
  2. Carga de datos A través de un JavaScript externo de archivos
  3. abrir una conexión persistente con SignalR
  4. Colocación Datos a elementos HTML
  5. Asignación de datos directamente a una variable de JavaScript
  6. Serialización de un objeto .NET en JavaScript Literal
Cuestiones relacionadas