目前,我正在为所工作的公司开发仪表板。此仪表板的功能对于此问题并不重要。该仪表板的构建方式如下:
Asp.net页(在课程后面带有代码)
定义Web方法的类
Javascript外部文件(具有仪表板的所有功能,该仪表板可完全在客户端运行)
其余部分,我将在TFS(团队基础服务器)环境中使用Visual Studio 2010 Ultimate,并且我们使用jQuery库和.NET Framework 4.0(C#)。
好吧,我希望借助这些信息可以解释我的问题。外部javascript文件包含三个类。我现在将它们命名为ClassMain,ClassSub1,ClassSub2。通过执行以下javascript命令,可从ClassMain派生类ClassSub1和ClassSub2:
ClassSub1 = new ClassMain();
在实例化ClassMain之后,将加载ClassSub1的其他属性和方法。 ClassMain可以与ClassSub1的属性和方法进行通信,而ClassSub1可以与ClassMain进行通信。因此,这意味着它们就像具有各种功能的大类一样。
我解释这一点是因为我认为问题出在这里,但我不确定。类SubSub1和ClassSub2在asp.net页面的代码背后被实例化。以下代码段对此进行了解释:
StringBuilder javascriptBlockBuilder = new StringBuilder();
javascriptBlockBuilder.AppendFormat("var {0};", this.Id);
javascriptBlockBuilder.AppendFormat("Sys.Application.add_load({0}LoadHandler);", this.Id);
javascriptBlockBuilder.AppendFormat("function {0}LoadHandler() {1}", this.Id, "{");
javascriptBlockBuilder.AppendFormat("{0} = new ClassSub1('{0}');{1}", this.Id, "}");
javascriptBlockBuilder.AppendFormat("var {0};", this.OtherId);
javascriptBlockBuilder.AppendFormat("Sys.Application.add_load({0}LoadHandler);", this.OtherId);
javascriptBlockBuilder.AppendFormat("function {0}LoadHandler() {1}", this.OtherId, "{");
javascriptBlockBuilder.AppendFormat("{0} = new SubClass2('{0}');{1}", this.OtherId, "}");
Page.ClientScript.RegisterStartupScript(this.GetType(), "ClassInitialization", javascriptBlockBuilder.ToString(), true);
在此代码段中,我在页面上创建了一个全局变量,并将该类分配给它。 ClassMain与ClassSub1和ClassSub2获得相同的ID,因此它们使用相同的变量,因为像我说的那样,这些类的几行必须作为一个类(ClassMain和ClassSub)起作用。
这也可行,但是问题也来了。在执行上面的代码片段之前(或之后),我有一些这样的语句:
this.myButton.Attributes.Add("onclick", string.Format("{0}.myJavascriptFunctionality();", this.id));
该功能已附加到分区,按钮等上。
好的,现在我将渲染页面,页面将完美加载,但是当我单击按钮,分隔等之一时,是否告诉我它需要一个对象。不知何故,带有ClassSub1和ClassSub2的全局变量丢失了,现在它无法执行我的JavaScript命令。
所以我的问题是,我的变量丢失怎么发生?我希望我的解释足以理解。
最佳答案
看起来您在myButton的onclick事件中正在调用ClassSub1.myJavascriptFunctionality()。
ClassSub1是函数定义/原型-您正在使用的任何OOP机制。您将必须指定变量名,而不是类名。
像这样
this.myButton.Attributes.Add("onclick", String.Format("{0}.myJavascriptFunctionality();", this.Id));