ASP.Net ScriptControl - вызов одного метода из другого - PullRequest
0 голосов
/ 30 декабря 2008

Допустим, у меня есть два элемента управления сценариями, а один элемент управления имеет другой дочерний элемент управления:

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, и я могу вызывать методы самого класса, однако я не могу вызвать те же методы из this._childControl объект. Можно подумать, что если дизайн класса (?) В памяти распознает существующий метод, и объект, созданный из этого класса, тоже будет.

Ответы [ 3 ]

1 голос
/ 31 декабря 2008

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

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

Проблема в «этом». Это в javaScript относится к объекту DOM. Вам нужно сделать что-то похожее на то, что происходит при использовании Function.createDelegate, что требуется при использовании $ addHandler (который, я знаю, вы не используете, просто задает контекст).

0 голосов
/ 14 мая 2010

У вас есть пара вариантов.

  1. Вы можете найти дочерний элемент управления сценарием с помощью $ find () . Но вы рискуете инициализировать свой родительский контроль перед дочерним контролем.

    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 () родительских элементов управления.

...