¿Cómo proporciono datos de variables de JavaScript de las variables de ASP.NET?
escaping scorm (9)
Creé una API SCORM para nuestro LMS y en este momento estoy usando un ID de usuario codificado 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 puedo incluirlos en JavaScript para poder incluirlos en mis llamadas al .ashx que maneja las llamadas SCORM?
Probablemente mejor es más fácil exponerlos como propiedades de su página (o página maestra si se usa 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>
Luego configure los valores en Page_Load (o en Page_Load para la página maestra).
public void Page_Load( object source, EventArgs e )
{
UserID = Session["userID"];
CourseID = Session["courseID"];
...
}
También puedes usar cookies HTTP. Ese enfoque es bueno si necesita pasar valores en la otra dirección también.
Todas las respuestas aquí sugieren algo así como
var userID = ''<%= UserID %>'';
a todos les falta algo importante si la variable que está incrustada puede contener datos de cadena arbitrarios. 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 que se necesita aquí . Usando el código de Rick, la variable incrustada se verá así:
var userId = <%= EncodeJsString(UserID) %>;
Tenga en cuenta que no hay citas ahora, el código de Rick ajusta la cadena escapada con comillas.
Este artículo describe la solución más pragmática varias soluciones pragmáticas a su problema.
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.
Estos son los pasos que deberá seguir:
En tu 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 función de sus necesidades, ahora debe configurar esas propiedades. El problema es que estas propiedades deben establecerse antes de que se las haga referencia desde JavaScript. Tal vez algo así en el evento Page_Load
:
_userId = Session["userId"];
_courseId = Request.QueryString["CourseId"] != null ? Request.QueryString["CourseId"] : String.empty;
Por supuesto, puede analizarlos según los tipos adecuados según sus requisitos.
Finalmente, puede hacer referencia a ellos en JavaScript de la siguiente manera:
var currentUserId = ''<% = UserId %>'';
var currentCouseId = ''<% = CourseId %>'';
Esto definitivamente debería funcionar. He usado este enfoque muchas veces.
No estoy seguro acerca de los archivos SCORM o .ashx (no hay experiencia allí) pero en cuanto a obtener valores de ASP.NET puedes hacer todo tipo de cosas como
var xyz = ''<%= variable %>'';
desde dentro de su página ASP.NET. 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 haber una solución más elegante para usted.
Al pasar los datos del lado del servidor .NET a JavaScript , enumero varios enfoques, que incluyen:
- Obtener datos haciendo una solicitud AJAX
- Cargando datos a través de un archivo JavaScript externo
- Apertura de una conexión persistente con SignalR
- Adjuntar datos a elementos HTML
- Asignación de datos directamente a una variable de JavaScript
- Serializar un objeto .NET en un JavaScript Literal
La respuesta de @tvanfosson es que normalmente he hecho esto en el pasado, pero solo estaba tratando de pensar en algo un poco más elegante. Pensé en tirar esto por ahí.
Puede configurar una HashTable 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
Luego establece variables como esta:
jsvars.Add("name", "value")
A continuación, serialice las variables en JavaScript en su página:
<script type="text/javascript">
var vars = <%=json.Serialize(jsvars)%>;
alert(vars.name);
</script>
Esto garantiza que todas las variables se escapen correctamente y también minimiza el código si necesita trabajar con muchas variables.