我创建了一个包含 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);
这适用于静态放置的控件,但和以前一样,不适用于动态添加的控件。该脚本只是没有进入源视图。