0

我创建了一个包含 AjaxControlToolkit 的 AutoCompleteExtender 的 UserControl。当我在同一页面上有一个或多个静态设计的实例时,它工作得很好。但是,如果动态添加这些控件之一(例如,在 UpdatePanel 中),则该控件的<script>块(我目前已嵌入源视图中)似乎不可用(JavaScript 抱怨它找不到我连接到 OnClientItemSelected 的功能)。

我怀疑我需要在其 PreRender 事件中注册 UserControl 的脚本,因此即使将其动态添加到页面中,它们也可用。我正在使用 ToolkitScriptManager,并想象我需要ScriptManager.RegisterScriptControl(this);从我的控件中调用,然后实现 IScriptControl 接口。

这是正确的方法吗?如果是这样,要正确实现 IScriptControl,我是否必须将脚本块移出源视图并移到其自己的 .js 文件中?这将迫使我重新设计我的 JS 函数,因为它调用内联代码来检索该特定实例中子控件的 ClientID:

var hiddenField = $get('<%=this.hfItemID.ClientID%>');

脚本管理和 JS 不是我的专长,所以我想确保这是正确的方向,然后我才开始以编程方式添加它们之前运行良好的 UserControl 复杂化。

更新

我已将 javascript 移到后面的代码中,并将其注册为 ClientScript,希望它能让我更接近我需要的位置:

string searchScript = "function " + this.aceItemSearch.ClientID + "_getByID(sender, e) { var hfield = $get('" + this.hfItemID.ClientID + "'); if (typeof hfield === 'undefined') return; var item = eval('(' + e._value + ')'); hfield.value = item.ID; if (typeof document != 'undefined') { var control = $get('" + this.btnSearch.ClientID + "'); } control.click(); }";    
Page.ClientScript.RegisterStartupScript(this.GetType(), aceItemSearch.ClientID + "_getByID", searchScript, true);

这适用于静态放置的控件,但和以前一样,不适用于动态添加的控件。该脚本只是没有进入源视图。

4

1 回答 1

0

当调用静态的、5 参数版本的 RegisterStartupScript时,将脚本移动到后面的代码中有效。提供 UserControl 本身作为第一个参数:

string searchScript = "function " + this.aceItemSearch.ClientID + "_getByID(sender, e) { var hfield = $get('" + this.hfItemID.ClientID + "'); if (typeof hfield === 'undefined') return; var item = eval('(' + e._value + ')'); hfield.value = item.ID; if (typeof document != 'undefined') { var control = $get('" + this.btnSearch.ClientID + "'); } control.click(); }";    
ScriptManager.RegisterStartupScript(this, this.GetType(), aceItemSearch.ClientID + "_getItemByID", searchScript, true);
于 2013-08-06T19:14:18.287 回答