如何从 ASP.NET 变量中提供 JavaScript 变量数据?

IT技术 javascript asp.net escaping scorm
2021-02-25 15:53:14

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

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

6个回答

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

 <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。
2021-04-25 15:53:14
var SelectArray = [<%= CropSelectArray %>] ; 对于数组
2021-05-01 15:53:14
这可能无关紧要,因为该答案已有 7 年历史,但出于性能原因,在 .aspx 页面中不包含脚本标签吗?
2021-05-05 15:53:14
我处理的系统中的许多用户 ID 都是由系统管理员输入的字符串。这就是为什么 o'brien 这个名字是一个很好的测试用例的原因。通常最好是防御性的,不要假设您嵌入的变量不是 Javascript 字符串安全的。
2021-05-11 15:53:14
@andynormancx - 注意到,但很有可能一个 id 字段将是一个数值而不是一个问题。
2021-05-12 15:53:14

@tvanfosson 的回答是我过去通常这样做的方式,但只是想想一些更优雅的东西。以为我会把它扔在那里。

您可以在代码隐藏中设置一个 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>

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

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

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

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

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

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

请注意,现在没有引号,Rick 的代码用引号将转义的字符串包装起来。

有些人可能希望由客户端而不是服务器来完成这项工作。无论哪种方式,重要的是要指出,一旦您在所需的位置获取数据,就需要对其进行清理、解析、检查,而不仅仅是立即使用。
2021-05-08 15:53:14
嗯?怎么可能在客户端上完成这项工作?文本需要先转义,然后才能嵌入到 javascript 变量中。
2021-05-15 15:53:14

这篇文章描述了最务实的解决办法 您的问题的几种实用解决方案。

虽然这在理论上可以回答问题,但最好在此处包含答案的基本部分,并提供链接以供参考。
2021-04-17 15:53:14
它们似乎都没有处理嵌入带有任意字符串数据的 Javascript 字符串的转义问题。
2021-04-25 15:53:14
好点 - 我编辑了我的答案以更好地反映文章的内容
2021-05-01 15:53:14
我不清楚为什么该解决方案是最“务实的”。根据他的需要,似乎太复杂了。
2021-05-08 15:53:14

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

在您的代码隐藏页面中:

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 %>';

这绝对有效。我已经多次使用这种方法。