2008-12-30 27 views
0

說一個方法,我有兩個腳本控件和一個控制有其他的子控件:ASP.Net ScriptControl的 - 從另一個調用

ParentControl : ScriptControl 
{ 
    ChildControl childControl; 
} 

的子控件腳本:

ChildControl = function(element) 
{ 
    ChildControl.initializeBase(this, [element]); 
} 

ChildControl.prototype = 
{ 
    callMethod: function() 
    { 
     return 'hi'; 
    }, 

    initialize: function() 
    { 
     ChildControl.callBaseMethod(this, 'initialize'); 
    }, 

    dispose: function() 
    { 
     ChildControl.callBaseMethod(this, 'dispose'); 
    } 
} 

而且在劇本方面我想呼籲子控件的方法:

ParentControl.prototype = 
{ 
    initialize: function() 
    { 
     this._childControl = $get(this._childControlID); 
     this._childControl.CallMethod(); 

     ParentControl.callBaseMethod(this, 'initialize'); 
    }, 

    dispose: function() 
    { 
     ParentControl.callBaseMethod(this, 'dispose'); 
    } 
} 

問題是,每次我嘗試這是說:此方法未找到或不受支持。不應該通過ParentControl訪問ChildControl上的所有方法嗎?

有什麼辦法讓我的方法公開,讓ParentControl可以看到它嗎?

更新 是否可以「鍵入」this._childControl?

這就是我要求的原因......當我使用Watch時,系統知道ChildControl類是什麼,並且我可以從類本身調用方法,但是,我無法調用與此相同的方法。 _childControl對象。你會認爲如果內存中的類設計(?)識別出存在的方法,並且從該類實例化的對象也會。

回答

1

在客戶端上,通過傳遞給$ get來使用稱爲_childControlID的父控制對象的字段。這有幾個問題:

  1. _childControlID是如何設置的?我猜想通過將它作爲父控件的描述符中的屬性添加到服務器上,但您不顯示該代碼,並且不顯示客戶端父控件類上的屬性。
  2. $ get返回元素引用 - 不是控件。因此,即使_childControlID被設置爲有效的元素ID,該元素也不會有稱爲CallMethod的方法。如果客戶端子控件類在父控件之前進行了初始化,則該元素將具有一個名爲「control」的字段,您可以使用該字段來訪問將「自身」附加到該元素的腳本控件。這隻適用於在父控制之前初始化子控件,當然。
+0

下一個問題是刪除處理程序,因爲它看起來像孩子被刪除之前的部分,因此(我猜)孩子的控制對象不再存在。 – 2008-12-31 15:37:29

1

問題在於「這個」。這在javaScript中引用了DOM對象。你需要做類似於使用Function.createDelegate時發生的情況,這在使用$ addHandler(我知道你沒有使用,只給出上下文)時是必需的。

0

你有幾個選項。

  1. 您可以通過使用$找到()找到你的孩子的腳本控制。但是在子控制之前,你會遇到父控制被初始化的風險。

    this._childControl = $find(this._childControlID); 
    this._childControl.CallMethod(); 
    
  2. 可以使用AddComponentProperty()在服務器上的控制描述符的屬性寄存器。這將確保在初始化父控件之前初始化所有子控件。

    public class CustomControl : WebControl, IScriptControl 
    { 
        public ScriptControl ChildControl { get; set; } 
    
        public IEnumerable<ScriptDescriptor> GetScriptDescriptors() 
        { 
         var descriptor = new ScriptControlDescriptor("Namespace.MyCustomControl", this.ClientID); 
         descriptor.AddComponentProperty("childControl", ChildControl.ClientID); 
    
         return new ScriptDescriptor[] { descriptor }; 
        } 
    
        public IEnumerable<ScriptReference> GetScriptReferences() 
        { 
         var reference = new ScriptReference 
             { 
              Assembly = this.GetType().Assembly.FullName, 
              Name = "MyCustomControl.js" 
             }; 
    
         return new ScriptReference[] { reference }; 
        } 
    } 
    

這時只要您創建一個客戶端屬性「childControl」它會自動初始化並準備使用的父控件的init()方法中。