Пользовательский контроль с помощью API на стороне клиента

Возможно, я выбрал совершенно неуместный/плохой пример. У меня есть пользовательский элемент управления, который содержит кучу динамически созданных Telerik RadGrids. Мой пользовательский элемент управления добавлен к паре Telerik RadPageViews, которые являются частью RadMultiPage, используемой вместе с RadTabStrip. Что мне нужно сделать, так это вызвать функцию Javascript в моем пользовательском элементе управления, чтобы обновить его отображение всякий раз, когда выбран его родительский RadPageView. Итак, в основном у меня есть следующий код Javascript:

function OnClientTabSelected(sender, args)
{
    // Get the MyControl that is on this tab
    var myControl = $find("whatever");

    // Call a method that updates the display
    myControl.doSomething();
}

Спасибо,

Дэйвид


person dlarkin77    schedule 28.02.2011    source источник
comment
Можете ли вы получить ответ на этот вопрос для вашей проблемы: telerik.com/community/forums/aspnet-ajax/tabstrip/   -  person JPReddy    schedule 28.02.2011
comment
вместо использования javascript для обновления элемента управления, возможно, вам следует попробовать другие средства, такие как ajax, в приведенной выше ссылке.   -  person JPReddy    schedule 28.02.2011


Ответы (3)


Вы можете добавить div-оболочку в свой пользовательский элемент управления, а затем расширить этот div с помощью jQuery, чтобы добавить нужные методы и свойства. Хитрость заключается в том, чтобы установить div id='‹%=this.ID%>' - таким образом, div будет иметь тот же идентификатор, что и пользовательский элемент управления (что нормально, поскольку пользовательский элемент управления на самом деле ничего не отображает - только его содержимое ).

Затем, вернувшись на свою содержащую страницу, вы можете просто сослаться на свой идентификатор UserControl, используя $get('whatever') - и вы фактически выберете свой расширенный div..., в котором будут все ваши методы и свойства.

Преимущество этого подхода заключается в том, что все ваши методы и свойства имеют аккуратную область действия и ничего не находятся в глобальном пространстве имен.

У меня есть полное демонстрационное решение и подробная информация, если вам нужна дополнительная информация: http://programmerramblings.blogspot.com/2011/07/clientside-api-for-aspnet-user-controls.html

person kman    schedule 01.08.2011
comment
Выглядит хорошо. Обязательно посмотрю подробно. - person dlarkin77; 02.08.2011

Просто вызовите метод javascript в кнопке ввода, если вы уверены в названии этой функции.

<input type="button" value="test" onclick="doSomething()" />

Если вы поместите какой-либо javascript-код в элемент управления, он будет наплеван на страницу и будет доступен для вызова при условии, что они оба находятся в одной и той же форме.

например, ваш код будет выглядеть так, если вы посмотрите на источник этой страницы.

<script type="text/javascript">    
    function doSomething()
    {
      alert(new Date());
    }
</script>

<div>
  <span id="MyControl1_Label1">Dummy label</span>
</div>
<hr />
<input type="button" value="test" onclick="doSomething()" />

Изменить. На мой взгляд, это не лучший способ получить доступ к этим методам. Когда вы помещаете некоторый код javascript внутри элемента управления, он должен использоваться только в этом элементе управления (правила как такового нет, это просто предложение по дизайну). Если вы пытаетесь получить доступ к коду javascript элемента управления извне этого элемента управления, вам необходимо пересмотреть свой дизайн.

Если вы можете предоставить нам более подробную информацию о том, почему вы хотите получить доступ к этому методу, возможно, мы сможем предложить лучший способ сделать это.

Обновление: (Поскольку вы изменили свой вопрос): немного сложно ответить на этот вопрос, поскольку у меня нет практического опыта работы с элементами управления Rad. Я предполагаю, что должна быть какая-то функция, которая поможет вам обновить элементы управления на этой странице без использования javascript, возможно, взгляните на clientside-API, предоставленный для Rad.

Может быть, кто-то, кто знает об элементах управления RAD, поможет вам.

person JPReddy    schedule 28.02.2011
comment
Большое спасибо за пример кода. Но как мне вызвать doSomething, используя экземпляр MyControl? то есть: var x = ‹экземпляр MyControl›; х.сделать что-то(); - person dlarkin77; 28.02.2011
comment
@ dlarkin77: метод javascript не принадлежит какому-либо элементу управления как таковому, когда ваша страница отображается в браузере, она становится частью этой страницы, и между элементом управления и javascript нет связи. Если вы разместите несколько экземпляров одного и того же элемента управления на этой странице, то столько раз код javascript будет выплевывать на страницу, но после этого они не будут связаны ни с одним экземпляром. - person JPReddy; 28.02.2011
comment
Я отредактировал свой первоначальный вопрос, чтобы (надеюсь) лучше понять, чего я пытаюсь достичь. - person dlarkin77; 28.02.2011

Вы должны сделать метод управления общедоступным

public void doSomething

и вызовите это со страницы

myControl1.doSomething();
person PMC    schedule 28.02.2011
comment
Я должен был упомянуть, что doSomething — это метод Javascript. - person dlarkin77; 28.02.2011
comment
извините, надо было лучше прочитать вопрос. Можете ли вы опубликовать код для нажатия кнопки и метода doSomething. - person PMC; 28.02.2011
comment
// обработчик нажатия кнопки function test() { $find(‹%= myControl1.ClientID %›).doSomething(); } // Метод doSomething MyControl function doSomething() { alert(new Date()); } - person dlarkin77; 28.02.2011