views:

1713

answers:

7

I have created a SCORM API for our LMS and right now I am using hard coded userID and courseID variables (variables that reference things in the database). I need to pass the real userID and courseID instead of using hard coded ones. I know the userID is stored in the session and the courseID is passed over from the launch page.

How do I get these into javascript so I can include them in my calls to the .ashx that handles the SCORM calls?

+1  A: 

This article describes the most pragmatic solution several pragmatic solutions to your problem.

Andrew Hare
Not clear to me why that solution is the most "pragmatic." Seems way too complex based on what he needs.
nshaw
Good point - I edited my answer to better reflect the article's contents
Andrew Hare
None of them appear to deal with the escaping issues of embedding a Javascript string with arbitrary string data.
andynormancx
A: 

I'm not sure about SCORM or ashx files (no experience there) but as far as getting values from asp.net you can do all sorts of things like


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

from within your asp.net page. There are various ways to accomplish this but the end result is that the asp.net page renders the values of the variable in the html (or javascript) that is sent to the browser.

This is a generic asp.net and javascript answer, there may be a more elegant solution out there for you

Allen
+5  A: 

Probably best easiest to expose them as properties of your page (or master page if used on every page) and reference them via page directives.

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

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

Then set the values on Page_Load (or in the Page_Load for the master page).

  public void Page_Load( object source, EventArgs e )
  {

        UserID = Session["userID"];
        CourseID = Session["courseID"];
        ...
  }
tvanfosson
Don't forget that the embedded Javascript string needs to be escaped, otherwise back slashes, quotes and the like in the string will break you Javascript on the client side.
andynormancx
@andynormancx -- noted, but it's reasonably likely that an id field is going to be a numeric value and not be a problem.
tvanfosson
Many of the user ids in systems that I deal with are strings which are entered by the sysadmin. Which is why the name o'brien makes a very good test case. It is usually best to be defensive and not assume that variables you are embedding are not Javascript string safe.
andynormancx
A: 

You can also use HTTP cookies. That approach is nice if you need to pass values the other direction as well.

nshaw
A: 

All the answers here that suggest something like

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

are all missing something important if the variable you are embedded can contain arbitrary string data. The embedded string data needs to be escaped so that if it contains backslashes, quotes or unprintable characters they don't cause your Javascript to error.

Rick Strahl has some suggestions for the escaping code needed here. Using Rick's code the embedded variable will look like this:

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

Note that there are no quotes now, Rick's code wraps the escaped string with quotes.

andynormancx
Some people may want to have that work be done by the client rather than on the server. Either way, it is important to point out that once you get the data where you want it, it needs to be cleaned up, parsed, inspected, and not just instantly consumed.
Allen
Huh ? How it is possible to this this work on the client ? The text needs to be escaped before it can be embedded in the javascript variable.
andynormancx
A: 

Here are the steps that you will have to take:

in your code behind page"

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

set { _userId = value;} }

Step 2 : based on your requirement now you have to set up those properties. The catch is that these properties should be set before they are referenced from the JavaScript. May be something like this in the Page_Load event

_userId = Session["userId"]; _courseId = Request.QueryString["CourseId"] != null ? Request.QueryString["CourseId"] : String.empty; of course you can parse them to appropriat type based on your requirements.

Finally, you can reference them in javascript as follows:

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

This should definitely work. I have used this approach in so many features in my Web App I am currently working.

Shiva
A: 

I am in the process of doing the same thing. I am just passing whatever values I may need upon initialization and such in the API object's constructor. I have not seen any requirements as to how the API object can be created, just how it is located in the SCO's code.

Dan Appleyard