为动态AutoCompleteExtender注册OnClientItemSelected

时间:2013-08-06 17:20:07

标签: autocompleteextender toolkitscriptmanager iscriptcontrol

我创建了一个包含AjaxControlToolkit的AutoCompleteExtender的UserControl。当我在同一页面上有一个或多个静态设计的实例时,它运行良好。但是,如果动态添加其中一个控件(例如,在UpdatePanel中),那个控件的<script>块(我当前嵌入在Source视图中)似乎不可用(JavaScript抱怨说它无法找到我连接到OnClientItemSelected的函数)。

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

这是正确的做法吗?如果是这样,为了正确实现IScriptControl,我是否必须将脚本块移出Source视图并进入自己的.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);

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

1 个答案:

答案 0 :(得分:0)

当调用 static ,5-argument版本的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);