0

AjaxControlToolkit의 AutoCompleteExtender가 포함 된 UserControl을 만들었습니다. 같은 페이지에 정적으로 설계된 인스턴스가 하나 이상있을 때 잘 작동합니다. 그러나 이러한 컨트롤 중 하나가 동적으로 (예 : UpdatePanel 내에서) 추가되면 해당 컨트롤에 대한 <script> 블록 (현재 소스 뷰에 포함되어 있음)이 사용 가능하지 않은 것으로 보입니다 (JavaScript는 사용할 수 없다고 불평합니다). OnClientItemSelected까지 연결하는 함수를 찾으십시오.)동적 자동 완성 확장자에 OnClientItemSelected 등록

PreRender 이벤트에 UserControl 스크립트를 등록해야하므로 동적으로 페이지에 추가 할 때도 사용할 수 있습니다. ToolkitScriptManager를 사용하고 있는데 내 컨트롤에서 ScriptManager.RegisterScriptControl(this);을 호출하고 IScriptControl 인터페이스를 구현해야한다고 상상해보십시오.

이 방법이 맞습니까? 그렇다면 올바르게 IScriptControl을 구현하려면 스크립트 블록을 소스 뷰에서 자체 .js 파일로 옮겨야합니까? 이 인라인 코드를 호출하기 때문에 즉 그 특정 인스턴스 내에서 서브 컨트롤에 대한 클라이언트 ID를 검색하기 위해, 내 JS 기능을 재 설계 나 강제 :

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

스크립트 관리 및 JS 내 전문 아니다, 그래서 내가 원하는 내가 프로그램 적으로 추가하기 시작할 때까지 훌륭하게 작동하는 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(); }";  
Page.ClientScript.RegisterStartupScript(this.GetType(), aceItemSearch.ClientID + "_getByID", searchScript, true); 
:

업데이트

내가 할 필요가 어디에 희망이 나에게로 좀 더 가까이 얻을 것이다, 뒤에 코드로 자바 스크립트를 이동했습니다, 그리고 ClientScript로 등록하고

정적으로 배치 된 컨트롤에서 작동하지만 이전처럼 동적으로 추가 된 컨트롤에는 적용되지 않습니다. 이 스크립트는 소스 뷰로 만들지 않습니다.

답변

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);