从ASP.NET页面实例化javascript对象

从ASP.NET页面实例化javascript对象,javascript,asp.net,Javascript,Asp.net,您在web上找到的大多数使用ASP.NET页面中的javascript的示例都将javascript放在标记文件(*.aspx)中。当然,这是一个非常糟糕的想法(tm),除了最简单的javascript使用之外 当然,我们想要的是将javascript封装到一个类中,并实例化该类的一个实例并将其绑定到后面的代码 Microsoft在其IScriptControl界面中为用户控件和服务器控件提供了执行此操作的框架。这允许开发人员创建javascript“组件”-在*.js文件中定义javascri

您在web上找到的大多数使用ASP.NET页面中的javascript的示例都将javascript放在标记文件(*.aspx)中。当然,这是一个非常糟糕的想法(tm),除了最简单的javascript使用之外

当然,我们想要的是将javascript封装到一个类中,并实例化该类的一个实例并将其绑定到后面的代码

Microsoft在其IScriptControl界面中为用户控件和服务器控件提供了执行此操作的框架。这允许开发人员创建javascript“组件”-在*.js文件中定义javascript类,在包含控件的页面上包含*.js文件,实例化组件实例,根据代码中的值设置组件中的变量,以及获取客户端javascript中组件的引用

问题是-IScriptControl只适用于用户和服务器控件。它不能用于在页面级别实例化javascript对象

那么,人们是如何做到这一点的呢?我们使用了一些模式,这些模式似乎很有效。我想知道每个人对它们的看法,以及其他人在用什么

我们首先在*.js文件中定义一个javascript类。在后面的代码中,我们创建了一个loadJavascript()函数,在初始加载或完全回发(但不是部分回发)时从Page_Load调用该函数

在loadJavascript()中,我们使用ScriptManager.RegisterClientScriptInclude()包含*.js文件,然后构造一点javascript来实例化类的实例,为已知名称分配引用,并将对象的initialize()和dispose()方法注册为window.load和window.unload的处理程序

例如:

我们在全局名称空间中构造一个对象名,基于页面的ClientID,如果我们还没有。我们添加一个新类的实例作为全局对象的成员。我们添加了一个window.load处理程序,该处理程序调用对象的initialize()方法,传递对象方法需要访问的页面上控件的clientId。我们添加了一个window.unload处理程序,该处理程序调用对象的dispose()方法,执行任何必要的清理

这似乎对我们有用。我们已经在很多页面上使用了这种模式,其中一些页面进行了大量的部分回发,没有任何问题

首先,我想知道人们对这种模式的看法

但更重要的是,我想知道我们是否在重新发明轮子,是否有其他方法来处理我们正在解决的问题,而我们没有意识到

有谁有更好的主意吗

但更重要的是,我想知道我们是否在重新发明轮子,是否有其他方法来处理我们正在解决的问题,而我们没有意识到

我认为这是最好的方法,几年前我用同样的方法,在非常复杂的javascript代码中没有任何问题。我不明白你为什么质疑自己:)

你的想法是这样的,现在可能有一些变化,也许我不调用卸载,或者创建一个对象来保持foobar并正确地调用foobar,但是想法是一样的。我还检查Javascript文件是否已加载

string script = @"
    if (typeof (FooBar) != "undefined") {{
        var {0}fooBar = new FooBar();
        Sys.UI.DomEvent.addHandler(window, 'load', 
            function()
            {{
                {0}fooBar.initialize('{1}', '{2}');
            }}
        );
    }}

页面是一个控件,为什么不能使用常规框架呢?不,我没有。然而,鉴于该页面继承自控件,从您的描述中不清楚为什么不能在页面上使用它。我从你的评论中猜测它不起作用(或者不容易起作用)?我试过了,遇到了问题,然后去寻找另一种方法。现在很可能是我做错了什么。如果有人能告诉我它可以工作,我一定会重新审视它。或者,如果有人有另一种方法来实例化ASP.NET中javascript类的实例,我很想听听。
string script = @"
    if (typeof (FooBar) != "undefined") {{
        var {0}fooBar = new FooBar();
        Sys.UI.DomEvent.addHandler(window, 'load', 
            function()
            {{
                {0}fooBar.initialize('{1}', '{2}');
            }}
        );
    }}