C# WebForm中ArrayList转JS数组报错:当前上下文中不存在'arlist1'
问题原因及解决方案
错误原因分析
你遇到的「当前上下文中不存在名称‘arlist1’」错误,以及数据传递失败,主要有两个核心问题:
- 后端变量作用域问题:你在
Page_Load方法内定义的arlist1是局部变量,前端的<%= arlist1 %>只能访问页面类的protected/public成员变量,无法读取方法内的局部变量。 RegisterArrayDeclaration用法错误:这个方法是用来逐个添加JS数组元素的(比如RegisterArrayDeclaration("arlist1", "'Bill'")),而非直接传入序列化后的JSON字符串,直接传JSON会导致生成的JS代码语法错误。
解决方案一:页面成员变量+JSON序列化
后端代码修改
把需要传递的数据序列化为JSON字符串,并定义为页面类的protected成员,让前端可以访问:
public partial class JSPassData : System.Web.UI.Page { // 定义为页面protected成员,供前端模板访问 protected string ArlistJson; protected void Page_Load(object sender, EventArgs e) { ArrayList arlist1 = new ArrayList() { 1, "Bill", 300, 4.5f }; var serializer = new JavaScriptSerializer(); // 将ArrayList序列化为JSON字符串 ArlistJson = serializer.Serialize(arlist1); } }
前端代码修改
直接解析后端传递的JSON字符串为JS数组:
<body> <script> var jslist = []; function updateList() { // 解析JSON字符串为JS数组 var arlist1 = JSON.parse('<%= ArlistJson %>'); jslist = arlist1; document.getElementById("demo").innerHTML = jslist; } window.onload = updateList; </script> <form id="form1" runat="server"> <p id="demo"></p> </form> </body>
解决方案二:直接注册JS变量(无需页面成员)
通过RegisterClientScriptBlock直接在页面输出定义JS数组的代码,无需暴露页面成员变量:
后端代码修改
public partial class JSPassData : System.Web.UI.Page { protected void Page_Load(object sender, EventArgs e) { ArrayList arlist1 = new ArrayList() { 1, "Bill", 300, 4.5f }; var serializer = new JavaScriptSerializer(); var json = serializer.Serialize(arlist1); // 直接注册一段JS代码,定义arlist1变量 Page.ClientScript.RegisterClientScriptBlock( this.GetType(), "ArlistData", $"var arlist1 = {json};", true ); } }
前端代码修改
直接使用后端注册好的arlist1变量:
<body> <script> var jslist = []; function updateList() { jslist = arlist1; document.getElementById("demo").innerHTML = jslist; } window.onload = updateList; </script> <form id="form1" runat="server"> <p id="demo"></p> </form> </body>
内容的提问来源于stack exchange,提问作者rorona
相关产品推荐
相关产品推荐

