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

loc*_*boy 36 javascript c# asp.net

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

对不起,如果我早先模糊的话.问题其实很简单.让我们说简单,在我的aspx.cs文件中我声明:

int [] numbers = new int[5];
Run Code Online (Sandbox Code Playgroud)

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

zer*_*kms 56

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

虚拟样本:

<% var serializer = new System.Web.Script.Serialization.JavaScriptSerializer(); %>
var jsVariable = <%= serializer.Serialize(array) %>;
Run Code Online (Sandbox Code Playgroud)


Anh*_*Ngo 18

这是为了补充zerkms的答案.

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

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

    var serializer = new System.Web.Script.Serialization.JavaScriptSerializer();
%>
Run Code Online (Sandbox Code Playgroud)

稍后在aspx页面上的某个地方

<script type="text/javascript">
    var jsVariable = <%= serializer.Serialize(numbers) %>;
</script>
Run Code Online (Sandbox Code Playgroud)

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

注意:也不要将此标记为答案,因为我希望语法高亮显示另一个答案更清晰.


Gar*_*ary 15

您可以使用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());
Run Code Online (Sandbox Code Playgroud)

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

这里是用于检查注入数组"testArray"的Javascript,然后才能使用它:

if (testArray)
{
  // do something with testArray
}
Run Code Online (Sandbox Code Playgroud)

这里有两个问题:

  1. 有些人认为这会侵入C#以注入Javascript

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

如果您不能忍受这种情况,另一种方法是让C#代码将Array保存到View State中,然后让JavaScript使用PageMethods(或Web服务)回调服务器以将View State对象作为一个阵列.但我认为这样的事可能有点过头了.

  • @Gary:我关注的是ad hoc序列化.如果该列表中的字符串包含单引号,我们就会遇到问题.这就是使用JSON序列化器更安全的原因. (2认同)

Che*_*hen 11

在页面文件中:

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

在代码背后:

public int[] numbers = WhatEverGetTheArray();
Run Code Online (Sandbox Code Playgroud)


San*_*anR 6

对于对象数组:

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

对于int数组:

 var array= JSON.parse('@Newtonsoft.Json.JsonConvert.SerializeObject(numbers)');
Run Code Online (Sandbox Code Playgroud)