我创建了一个UserControl,其中包含AjaxControlToolkit的AutoCompleteExtender。当我在同一页面上有一个或多个静态设计的实例时,它工作得很好。但是,如果其中一个控件是动态添加的(比如在UpdatePanel中),则该控件的<script>
块(我目前已嵌入到Source视图中)似乎不可用(JavaScript抱怨找不到我连接到OnClientItemSelected的函数)。
我怀疑我需要在UserControl的PreRender事件中注册它的脚本,这样即使它被动态添加到页面中,它们也可以使用。我正在使用ToolkitScriptManager,想象一下我需要从我的控件中调用ScriptManager.RegisterScriptControl(this);
,然后实现IScriptControl接口。
这是正确的方法吗?如果是这样的话,为了正确地实现IScriptControl,我是否必须将脚本块从Source视图移到它自己的.js文件中?这将迫使我重新设计JS函数,因为它调用内联代码来检索特定实例中的子控件的ClientID:
var hiddenField = $get('<%=this.hfItemID.ClientID%>');
脚本管理和JS不是我的专长,所以在我开始用程序添加它们之前,我想确保这是正确的方向。
更新
我已经将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);
这适用于静态放置的控件,但与以前一样,不适用于动态添加的控件。脚本只是没有进入源代码视图。
当调用RegisterStartupScript的静态、5参数版本时,将脚本移动到代码隐藏即可。提供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);