2010-06-17 3 views
3

asp.net Ajax 용 스크립트 컨트롤을 만들고 있는데 GetScriptReferences() 함수를 호출 할 수 있지만 GetScriptDescriptors()을 가져올 수 없습니다.GetScriptDescriptors가 스크립트 컨트롤에서 호출되지 않습니다.

나는 ScriptControl, ScriptControlBase, IScriptControl에서 파생 해 봤습니다. 페이지 스크립트 관리자로 컨트롤을 등록 할 수 있지만 함수를 호출 할 수 없습니다.

나는 무엇을 놓쳤을지도 모릅니다. 당신이 IScriptControl를 사용하는 경우

public class FilterGroupingControl : CompositeControl, IScriptControl 
{ 
    public List<FilterGrouping> Groupings { get; set; } 

    public FilterGroupingControl() 
    { 
     this.Groupings = new List<FilterGrouping>(); 
    } 

    protected override void OnPreRender(EventArgs e) 
    { 
     #region register control with script manager 

     ScriptManager scriptManager = ScriptManager.GetCurrent(Page); 
     if (scriptManager == null) 
      throw new InvalidOperationException("There must be a script manager on the page"); 
     scriptManager.RegisterScriptControl(this); 

     #endregion 

     base.OnPreRender(e); 
    } 

    public IEnumerable<ScriptDescriptor> GetScriptDescriptors() 
    { 
     throw new InvalidOperationException(); 
     ScriptControlDescriptor d = new ScriptControlDescriptor("Web.UI.Controls.FilterGroupingControl", this.ClientID); 
     d.AddProperty("Groupings", this.Groupings.ToArray()); 


     return new ScriptDescriptor[] { d }; 
    } 


    public IEnumerable<ScriptReference> GetScriptReferences() 
    { 
     // throw new InvalidOperationException(); 
     return new ScriptReference[0]; 
    } 
} 
+0

렌더 컨트롤을 오버라이드하지 않고 base.Render를 호출하지 않는 한 스크립트 컨트롤이 렌더에서 메서드를 호출하기 때문에 스크립트 컨트롤이 작동해야합니다 ... –

답변

0

, 당신은 다음 렌더링 과정이를 추가해야합니다

if (!this.DesignMode) 
    { 
     ScriptManager.GetCurrent(this.Page).RegisterScriptDescriptors(this); 
    } 

여기에 언급 한 바와 같이 : GetScriptReferences does not get called

RegisterScriptControl이 스크립트의 스크립트 관리자를 통지하고, GetScriptReferences를 호출 . 구성 요소 등록을 처리하려면 RegisterScriptDescriptors으로 전화해야하고 이후 클라이언트에서는 $create 메서드 호출을 호출해야합니다.

관련 문제