【问题标题】:How do I give JavaScript variables data from ASP.NET variables?如何从 ASP.NET 变量中提供 JavaScript 变量数据?
【发布时间】:2009-02-16 16:07:41
【问题描述】:

我已经为我们的 LMS 创建了一个 SCORM API,现在我正在使用硬编码的 userID 和 courseID 变量(引用数据库中事物的变量)。我需要传递真实的用户 ID 和课程 ID,而不是使用硬编码的。我知道用户 ID 存储在会话中,课程 ID 是从启动页面传递过来的。

如何将这些输入到 JavaScript 中,以便可以将它们包含在我对处理 SCORM 调用的 .ashx 的调用中?

【问题讨论】:

    标签: javascript asp.net escaping scorm


    【解决方案1】:

    可能最好最容易将它们公开为页面的属性(或母版页,如果在每个页面上使用)并通过页面指令引用它们。

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

    然后在 Page_Load(或母版页的 Page_Load)上设置值。

      public void Page_Load( object source, EventArgs e )
      {
    
            UserID = Session["userID"];
            CourseID = Session["courseID"];
            ...
      }
    

    【讨论】:

    • 不要忘记嵌入的Javascript字符串需要转义,否则字符串中的反斜杠、引号等会破坏客户端的Javascript。
    • @andynormancx -- 注意到,但 id 字段很可能是一个数值而不是问题。
    • 我处理的系统中的许多用户 ID 都是由系统管理员输入的字符串。这就是为什么 o'brien 这个名字是一个很好的测试用例。通常最好采取防御措施,不要假设您嵌入的变量不是 Javascript 字符串安全的。
    • var SelectArray = [] ;对于数组
    • 这可能不相关,因为此答案已有 7 年历史,但出于性能原因,不赞成在 .aspx 页面中包含脚本标签?
    【解决方案2】:

    @tvanfosson's answer 是我过去通常这样做的方式,但只是想想一些更优雅的东西。以为我会把它扔出去。

    你可以在代码隐藏中设置一个HashTable,也可以初始化一个JavaScriptSerializer:

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

    然后像这样设置变量:

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

    然后将变量序列化为页面中的 JavaScript:

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

    这样可以确保所有变量都被正确转义,并且如果您需要处理大量变量,还可以最大限度地减少代码。

    【讨论】:

      【解决方案3】:

      这里的所有答案都暗示了类似的东西

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

      如果您嵌入的变量可以包含任意字符串数据,则都缺少一些重要的东西。嵌入的字符串数据需要进行转义,这样如果它包含反斜杠、引号或不可打印的字符,它们就不会导致您的 Javascript 出错。

      Rick Strahl 对 here 所需的转义代码有一些建议。 使用 Rick 的代码,嵌入变量将如下所示:

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

      注意现在没有引号,Rick 的代码用引号包裹了转义的字符串。

      【讨论】:

      • 有些人可能希望该工作由客户端完成,而不是在服务器上完成。无论哪种方式,重要的是要指出,一旦您获得所需的数据,就需要对其进行清理、解析、检查,而不仅仅是立即使用。
      • 嗯?怎么可能在客户端上进行这项工作?文本需要转义才能嵌入到 javascript 变量中。
      【解决方案4】:

      This article描述最务实的解决方案几个实用的解决你的问题。

      【讨论】:

      • 我不清楚为什么该解决方案是最“实用的”。根据他的需要,这似乎太复杂了。
      • 好点 - 我编辑了我的答案以更好地反映文章的内容
      • 它们似乎都没有处理将 Javascript 字符串嵌入任意字符串数据的转义问题。
      • 虽然这在理论上可以回答这个问题,it would be preferable 在此处包含答案的基本部分,并提供链接以供参考。
      【解决方案5】:

      以下是您必须采取的步骤:

      在您的代码后面的页面中:

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

      第 2 步:根据您的要求,您现在必须设置这些属性。问题是这些属性应该在它们被 JavaScript 引用之前设置。在Page_Load 事件中可能是这样的:

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

      当然,您可以根据自己的要求将它们解析为适当的类型。

      最后,您可以在 JavaScript 中引用它们,如下所示:

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

      这绝对可以。这种方法我用过很多次了。

      【讨论】:

        【解决方案6】:

        在Passing .NET Server-Side Data to JavaScript 中,我列出了各种方法,包括:

        1. 通过 AJAX 请求获取数据
        2. 通过外部 JavaScript 文件加载数据
        3. 使用 SignalR 打开持久连接
        4. 将数据附加到 HTML 元素
        5. 将数据直接分配给 JavaScript 变量
        6. 将 .NET 对象序列化为 JavaScript 文字

        【讨论】:

          【解决方案7】:

          您也可以使用 HTTP cookie。如果您还需要向另一个方向传递值,那么这种方法很好。

          【讨论】:

            【解决方案8】:

            我正在做同样的事情。我只是在 API 对象的构造函数中传递初始化时可能需要的任何值。我没有看到关于如何创建 API 对象的任何要求,只是它在 SCO 代码中的位置。

            【讨论】:

              【解决方案9】:

              我不确定 SCORM 或 .ashx 文件(没有经验),但就从 ASP.NET 获取值而言,您可以做各种各样的事情,例如

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

              从您的 ASP.NET 页面中。有多种方法可以实现这一点,但最终结果是 ASP.NET 页面在发送到浏览器的 HTML(或 JavaScript)中呈现变量的值。

              这是一个通用的 ASP.NET 和 JavaScript 答案,可能有更优雅的解决方案适合您。

              【讨论】:

                猜你喜欢
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 2020-09-17
                相关资源
                最近更新 更多