2008-12-30 4 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'); 
    } 
} 

Проблема, каждый раз, когда я пытаюсь это говорит этот метод не найден или не поддерживается. Не следует ли доступ ко всем методам ChildControl к ParentControl?

Есть ли способ, которым я должен сделать метод общедоступным, чтобы ParentControl мог его видеть?

Обновление Можно ли «набрать» this._childControl?

Вот почему я спрашиваю ... Когда я использую Watch, система знает, что такое класс ChildControl, и я могу вызывать методы из самого класса, однако я не могу вызывать те же методы из этого. Объект _childControl. Вы могли бы подумать, что если класс (?) В памяти распознает существующий метод, и объект, созданный из этого класса, тоже будет.

ответ

1

На клиенте вы используете поле своего родительского объекта управления, называемого _childControlID, передавая его в $ get. Есть несколько проблем с этим:

  1. Как установить _childControlID? Я бы предположил, добавив его как свойство в дескрипторе родительского элемента управления на сервере, но вы не показываете этот код, и вы не показываете свойство в родительском контрольном классе на стороне клиента.
  2. $ get возвращает ссылки на элементы - не элементы управления. Таким образом, даже если для параметра _childControlID был установлен допустимый идентификатор элемента, этот элемент не будет иметь метод CallMethod. Если дочерний контрольный класс на стороне клиента инициализировался перед родительским элементом управления, у элемента будет поле под названием «control», которое вы можете использовать для доступа к элементу управления скриптом, который «прикреплен» к элементу. Это работает, только если дочерний элемент управления инициализирован перед родительским элементом управления.
+0

Следующая проблема заключается в удалении обработчика, так как он выглядит так, будто ребенок удаляется перед частью, и поэтому (я предполагаю) объект управления дочернего элемента больше не выполняется. –

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() метод.

Смежные вопросы