0

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

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

这是正确的做法吗?如果是这样,要正确实现IScriptControl,是否必须将脚本块从源视图移到它自己的.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); 

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

回答

0

移动脚本代码中的静态,的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);