如何在脚本#中使用onBeforeUnload事件?

时间:2011-04-12 18:57:56

标签: javascript asp.net javascript-events script#

我在ASP.NET中使用Script#库。我想听,并回应onBeforeUnload浏览器事件。

我目前正在拦截这样的事件:

Window.AttachEvent( "onbeforeunload", OnNavigateAway );
...
private void OnNavigateAway()
{
    Script.Alert("You're leaving.");
}

但Window.AttachEvent的第二个参数是DOMEventHandler,它的返回类型为void。要使用onBeforeUnload事件,我需要能够返回一个字符串值,浏览器将其用作确认消息。

有没有办法在不发出脚本文字或手工编码的情况下执行此操作?我真的更喜欢留在编译的C# - > javascript尽可能多。

如果它很重要,我使用的是Script#library 0.5.5版本,这不是最新版本,但我现在仅限于此。


更新:DuckMaestro完美地回答了我的问题,但它仍然不适合我。这是我的问题的正确答案,因为编译的Javascript正是我期待和想要的。但它没有导致浏览器发出警告提示的预期效果。

我确实有一个解决办法,以防万一其他人偶然发现这个答案,并想知道我最初是如何破解它的。而不是:

public delegate string BeforeUnloadDelegate();
...
Window.AttachEvent( "onbeforeunload", (DOMEventHandler) (Object) 
    new BeforeUnloadDelegate(OnNavigateAway) );

我这样做了:

Script.Literal( "window.onbeforeunload = this._onNavigateAway" );

由于多种原因,这种形式很糟糕。这只适用于Script#生成的.debug.js类;脚本#更改了发行版中的名称,因此Script.Literal语句发出的脚本将不匹配。此外,它首先否定了使用Script#的许多好处。 (例如,使用Visual Studio的重构工具将OnNavigateAway重命名为其他内容将在字符串中留下孤立引用。)此外,C#代码将方法声明为OnNavigateAway,而Script.Literal必须引用this._onNavigateAway。

但是,如果像我一样,你正处于截止日期并寻找黑客,那么这是一个开始的地方。如果我在更正确的版本上取得更多进展,我会用详细信息更新此问题。

再次感谢DuckMaestro回答我提出的问题。

1 个答案:

答案 0 :(得分:2)

我会声明一个新的委托类型

public delegate string BeforeUnloadCallback();

然后将您的attachEvent代码更改为

Window.AttachEvent( "onbeforeunload", (DOMEventHandler)(Object) new BeforeUnloadCallback(OnNavigateAway) );

我不是肯定会对0.5.5有效,但这是我在0.6.x中不时使用的那种技巧。