将 C# ASP.NET 数组传递给 Javascript 数组

IT技术 c# javascript asp.net
2021-02-12 08:12:19

有谁知道如何将 C# ASP.NET 数组传递给 JavaScript 数组?示例代码也很好。

对不起,如果我之前含糊不清。这个问题其实很简单。为简单起见,让我们在我的aspx.cs文件中声明:

int [] numbers = new int[5];

现在我想传递numbers给客户端并在 JavaScript 中使用数组中的数据。我该怎么做?

6个回答

System.Web.Script.Serialization.JavaScriptSerializer序列化它并分配给 javascript var

虚拟样本:

<% var serializer = new System.Web.Script.Serialization.JavaScriptSerializer(); %>
var jsVariable = <%= serializer.Serialize(array) %>;
很抱歉含糊不清。请参阅上文。
2021-03-24 08:12:19
@zerkms 你能解释一下发生了什么吗?对不起,我是菜鸟
2021-03-26 08:12:19
@zerkms - 考虑编辑此答案以使其完整并突出显示它支持任意类型的事实?
2021-04-05 08:12:19

这是为了补充zerkms的回答。

要跨语言障碍传递数据,您需要一种通过序列化数据将数据表示为字符串的方法。JavaScript 的序列化方法之一是 JSON。在 zerkms 的示例中,代码将放置在 aspx 页面内。要将他的示例和您的示例组合在一个 aspx 页面上,您应该:

<%
    int[] numbers = new int[5];
    // Fill up numbers...

    var serializer = new System.Web.Script.Serialization.JavaScriptSerializer();
%>

稍后在 aspx 页面的某个地方

<script type="text/javascript">
    var jsVariable = <%= serializer.Serialize(numbers) %>;
</script>

不过,这个答案假设您是从初始页面加载生成 JavaScript。根据您帖子中的评论,这可以通过 AJAX 完成。在这种情况下,您可以让服务器以序列化的结果作为响应,然后使用您喜欢的框架在 JavaScript 中对其进行反序列化。

注意:也不要将此标记为答案,因为我希望语法突出显示以使另一个答案更清晰。

出于某种原因,这不起作用。int[] 在后端(aspx.cs 文件),我还在 cs 文件中声明了序列化程序。当我写出脚本标签时,我收到错误,指出当前上下文中不存在 int[]
2021-03-17 08:12:19
更正,你说得对,serializer.Serialize(numbers) 带分号。我误读了,以为你的意思是分号。我还对代码进行了更正。
2021-03-21 08:12:19
另外,从初始页面加载中生成 js 是什么意思?
2021-03-22 08:12:19
你的意思是: var jsVariable = <%=serializer.Serialize(numbers)%> ?
2021-04-09 08:12:19
不,因为您是在生成 JavaScript 的上下文中。当你有 int[] numbers = new int[5] { 1, 3, 5, 7, 9 } 时,序列化它会给你,“[1, 3, 5, 7, 9]”。所以生成的javascript变成了“var jsVariable = [1, 3, 5, 7, 9];”
2021-04-12 08:12:19

您可以使用 ClientScript.RegisterStartUpScript 将 javascript 注入到 Page_Load 上的页面中。

这是 MSDN 参考的链接:http : //msdn.microsoft.com/en-us/library/asz8zsxy.aspx

这是 Page_Load 中的代码:

  List<string> tempString = new List<string>();
  tempString.Add("Hello");
  tempString.Add("World");

  StringBuilder sb = new StringBuilder();
  sb.Append("<script>");
  sb.Append("var testArray = new Array;");
  foreach(string str in tempString)
  {
    sb.Append("testArray.push('" + str + "');");
  }
  sb.Append("</script>");

  ClientScript.RegisterStartupScript(this.GetType(), "TestArrayScript", sb.ToString());

注意:使用 StringBuilder 构建脚本字符串,因为它可能很长。

这是在您可以使用它之前检查注入的数组“testArray”的Javascript:

if (testArray)
{
  // do something with testArray
}

这里有2个问题:

  1. 有些人认为这对 C# 注入 Javascript 具有侵入性

  2. 我们必须在全局上下文中声明数组

如果您不能忍受,另一种方法是让 C# 代码将数组保存到视图状态,然后让 JavaScript 使用 PageMethods(或 Web 服务)回调服务器以获取该视图状态对象作为大批。但我认为对于这样的事情来说,这可能有点矫枉过正。

我去看看谢谢你的解释。一件事,您将哪个数组称为全局数组,为什么?
2021-03-19 08:12:19
@Gary:我关心的是临时序列化。如果该列表中的字符串包含单引号,我们就会遇到问题。这就是使用 JSON 序列化程序更安全的原因。
2021-03-23 08:12:19
@Gary:我关心的是正确性,而不是大小。但是,由于 OP 使用双打并转换它们,因此似乎没有任何注入风险。
2021-03-25 08:12:19
@cfarm54:如果你看看我们必须在哪里声明 testArray 数组,它是 Javascript 中的一个全局变量。是的,在这种情况下,“this”是指页面。如果你把它放在一个用户控件中,它会返回用户控件类型;将代码注册到控件而不是页面。
2021-04-05 08:12:19
@cfarm54:它不应该影响其他脚本。这相当于在您的页面上有多个 <script> 部分或多个 .js 文件。如果您多次调用 RegisterClientScript,请确保第二个参数(在本例中为“TestArrayScript”)对于其他 RegisterClientScript 是唯一的。如果我的回答有帮助,请评价/标记答案!我正在努力获得足够的积分来发表评论:) 谢谢!
2021-04-11 08:12:19

在页面文件中:

<script type="text/javascript">
    var a = eval('[<% =string.Join(", ", numbers) %>]');
</script>

而在后面的代码中:

public int[] numbers = WhatEverGetTheArray();
变量“a”将是确切的 js 数组。您可以对其使用任何数组操作,例如 a[0] a[1] a.length。
2021-03-21 08:12:19
@cfarm54-在后面的代码中,您初始化了称为数字的 int[]。然后在 javascript 中,string.Join(", ", numbers)将“numbers”数组设为像“1,2,3,4”这样的字符串。之后,我们使用eval('[1,2,3,4]')将类似数组的字符串转换为数组。
2021-04-08 08:12:19
我不确定我是否理解这里的答案……你能帮我解释一下吗?
2021-04-10 08:12:19

对于对象数组:

var array= JSON.parse('@Newtonsoft.Json.JsonConvert.SerializeObject(numbers)'.replace(/&quot;/g, "\""));

对于 int 数组:

 var array= JSON.parse('@Newtonsoft.Json.JsonConvert.SerializeObject(numbers)');