我在用户控件中包含了一个JS文件。主机页面有多个用户控件实例。
JS文件有一个全局变量,用作JS函数的标记。我需要将此变量的作用范围限制在用户控件内。不幸的是,当我有多个控件实例时,变量值会被覆盖。
在这种情况下,推荐采取什么方法?
我在用户控件中包含了一个JS文件。主机页面有多个用户控件实例。
JS文件有一个全局变量,用作JS函数的标记。我需要将此变量的作用范围限制在用户控件内。不幸的是,当我有多个控件实例时,变量值会被覆盖。
在这种情况下,推荐采取什么方法?
<script language='javascript'>
var <%=this.ClientID%>myObject=new myObject();
</script>
Page.ClientScript.RegisterStartupScript()
。如果你必须继续使用当前的解决方案,你可以将全局变量重命名为以下代码中的内容,该代码应该在控件的 .ascx 文件中:
<script type='text/javascript'>
var <%= this.ClientID %>_name_of_global_variable;
</script>
在这里,“this”是指asp.net控件。这样,每个控件都有一个基于客户端id的唯一变量名。确保更新您的其余javascript以使用此新命名约定。问题是,它看起来很混乱,并且变量名将根据控件嵌入页面的位置而变得非常长。
明白了吗?只需要进行最少的javascript修改即可使其正常工作。
我建议你重构你的代码,将所有通用的JS逻辑放在一个地方,而不是在每个用户控件中。这将大大减少页面的大小。
你可以向通用JS方法传递UserControl的id来区分UserControl。
对于限制“UserControl”变量范围的问题,你可以存储一些键/值结构来保留你特定于用户控件的值 - 键将是用户控件客户端ID,而值将是你感兴趣的变量。
例如:
var UCFlags = new Object();
//set the flag for UserControl1:
UCFlags["UC1"] = true;
//set the flag for UserControl2:
UCFlags["UC2"] = false;
myFlag = UCFlags["UC1"];
在服务器端,您可以将常量字符串“UC1”或“UC2”替换为
<%= this.ClientID %>
像这样:
myFlag = UCFlags["<%= this.ClientID %>"];
UCFlags["<%= this.ClientID %>"] = value;