请问有人知道如何将C# ASP.NET的数组传递给JavaScript数组吗?如果能提供示例代码就更好了。
如果我之前表述不够清晰,非常抱歉。实际上,问题非常简单。假设在我的 aspx.cs
文件中我声明了:
int [] numbers = new int[5];
现在我想将numbers
传递到客户端,并在JavaScript中使用数组中的数据。我该如何做?
请问有人知道如何将C# ASP.NET的数组传递给JavaScript数组吗?如果能提供示例代码就更好了。
如果我之前表述不够清晰,非常抱歉。实际上,问题非常简单。假设在我的 aspx.cs
文件中我声明了:
int [] numbers = new int[5];
现在我想将numbers
传递到客户端,并在JavaScript中使用数组中的数据。我该如何做?
使用System.Web.Script.Serialization.JavaScriptSerializer
类将其序列化,并赋值给javascript变量。
示例:
<% var serializer = new System.Web.Script.Serialization.JavaScriptSerializer(); %>
var jsVariable = <%= serializer.Serialize(array) %>;
<%
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中反序列化它。
注意: 也不要将此标记为答案,因为我想要语法高亮来使另一个答案更清晰。
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
}
这里有两个问题:
一些人认为在C#中注入JavaScript会很烦人
我们必须在全局上下文中声明数组
如果你不能接受这些问题,另一个方法是让C#代码将数组保存到ViewState中,然后让JavaScript使用PageMethods(或Web服务)回调服务器来获取那个ViewState对象作为数组。但我认为对于这样的事情,这可能过度了。
<script type="text/javascript">
var a = eval('[<% =string.Join(", ", numbers) %>]');
</script>
在后台代码中:
public int[] numbers = WhatEverGetTheArray();
string.Join(“,”,numbers)
使“numbers”数组成为像“1,2,3,4”这样的字符串。之后,我们使用eval('[1,2,3,4]')
将类似数组的字符串转换为数组。 - Cheng Chen对于对象数组:
var array= JSON.parse('@Newtonsoft.Json.JsonConvert.SerializeObject(numbers)'.replace(/"/g, "\""));
对于整数数组:
var array= JSON.parse('@Newtonsoft.Json.JsonConvert.SerializeObject(numbers)');
准备一个数组(在我的情况下是2D数组):
// prepare a 2d array in c#
ArrayList header = new ArrayList { "Task Name", "Hours"};
ArrayList data1 = new ArrayList {"Work", 2};
ArrayList data2 = new ArrayList { "Eat", 2 };
ArrayList data3 = new ArrayList { "Sleep", 2 };
ArrayList data = new ArrayList {header, data1, data2, data3};
// convert it in json
string dataStr = JsonConvert.SerializeObject(data, Formatting.None);
// store it in viewdata/ viewbag
ViewBag.Data = new HtmlString(dataStr);
在视图中解析它。
<script>
var data = JSON.parse('@ViewBag.Data');
console.log(data);
</script>
我曾经遇到过类似的情况,而且我很容易地解决了它。这是我所做的。 假设你已经在aspx.cs
页面中拥有了数组中的值。
1)在你的aspx页面中添加一个隐藏域,并使用隐藏域ID来存储数组值。
HiddenField2.Value = string.Join(",", myarray);
2) 现在隐藏字段已经存储了值,只需用逗号分隔即可。在JavaScript中使用这个隐藏字段时,请按如下方式操作。简单地在JavaScript中创建一个数组,然后通过去除逗号将该值存储在该数组中。
var hiddenfield2 = new Array();
hiddenfield2=document.getElementById('<%=HiddenField2.ClientID%>').value.split(',');
整数数组很容易传递。但是这个解决方案也适用于更复杂的数据。在您的模型中:
public int[] Numbers => new int[5];
在你的观点中:
numbers = @(new HtmlString(JsonSerializer.Serialize(Model.Numbers)))
传递字符串的技巧。您可能想要JSON编码器不对字符串中的某些符号进行转义。例如,我希望使用未经转义的西里尔字母。在您的视图中:
strings = @(
new HtmlString(
JsonSerializer.Serialize(Model.Strings, new JsonSerializerOptions
{
Encoder = JavaScriptEncoder.Create(
UnicodeRanges.BasicLatin,
UnicodeRanges.Cyrillic)
})))
这里是另一个替代方案。你可以使用ClientScriptManager Page.ClientScript.RegisterArrayDeclaration。以下是图表数据的示例。
var page = HttpContext.Current.CurrentHandler as Page;
_data = "[Date.UTC(2018, 9, 29, 0, 3), parseFloat(21.84)]
,[Date.UTC(2018, 9, 29, 0, 13), parseFloat(21.84)]
,[Date.UTC(2018, 9, 29, 0, 23), parseFloat(21.83)]
,[Date.UTC(2018, 9, 29, 0, 33), parseFloat(21.83)]";
page.ClientScript.RegisterArrayDeclaration("chartdata0", _data);
var chartdata0 = new Array([Date.UTC(2018, 9, 29, 0, 3), parseFloat(21.84)]
,[Date.UTC(2018, 9, 29, 0, 13), parseFloat(21.84)]
,[Date.UTC(2018, 9, 29, 0, 23), parseFloat(21.83)]
,[Date.UTC(2018, 9, 29, 0, 33), parseFloat(21.83)]);
这个解决方案在Chrome 64浏览器(包括“版本78.0.3904.70(官方构建)(64位)”)上使用更大的数组时存在问题。您可能会遇到“未捕获的RangeError:超过最大调用堆栈大小”。但是,在IE11,Microsoft Edge和FireFox中可以正常工作。