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

Posted

技术标签:

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

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

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

【问题讨论】:

【参考方案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 中,我列出了各种方法,包括:

    通过 AJAX 请求获取数据 通过外部 JavaScript 文件加载数据 使用 SignalR 打开持久连接 将数据附加到 html 元素 将数据直接分配给 JavaScript 变量 将 .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 答案,可能有更优雅的解决方案适合您。

【讨论】:

以上是关于如何从 ASP.NET 变量中提供 JavaScript 变量数据?的主要内容,如果未能解决你的问题,请参考以下文章

如何使用目录名称中的句点从 Asp .Net Core 提供静态文件

如何将 Dictionary<string, string> 变量从后面的代码传递到 asp.net?

使用会话变量时如何解决 ASP.Net“输入字符串格式不正确”错误

如何在 MVC .ASP NET 中将变量从字符串转换为 int [重复]

如何将数据库从 SQL 服务器迁移到 SQL Azure,其中包含带有数据的 asp.net 成员资格提供程序

在 WCF 服务中使用 ASP.NET 成员资格提供程序身份验证