2009-03-16 3 views
4

У меня есть UserControl, который содержит UpdatePanel, который обертывает некоторые другие элементы управления. UserControl будет использоваться на некоторых страницах, на которых уже есть ScriptManager и другие страницы, на которых нет ScriptManager. Я бы хотел, чтобы UserControl автоматически приводил свой собственный ScriptManager, если он не существует.AJAX ScriptManager в UserControl

Я попытался ScriptManager.GetCurrent, и если он возвращает null, я создаю свой собственный ScriptManager и вставляю его в форму, но я не могу найти место достаточно рано в жизненном цикле UserControl для запуска этого кода. Я продолжаю получать ошибку «Элемент управления с идентификатором« uPnlContentList »требует ScriptManager на странице. ScriptManager должен появиться перед любыми элементами управления, которые в этом нуждаются». каждый раз, когда я пытаюсь загрузить страницу. Места, в которых я пытался запустить мой код, - OnInit, CreateChildControls и PageLoad, и они никогда не вызываются, потому что они умирают, прежде чем достигнуть их.

Куда я могу поставить эту чек?

ответ

2

Ненавижу приходить к этому в другом направлении, но вы используете мастер-страницу? И если да, подумали ли вы о том, чтобы разместить на нем один ScriptManager и сделать с ним?

+0

Нет никаких мастер-страниц .... Не заставляйте меня начать :) Мои руки связаны с этим решением. – cjserio

+2

Почему это ответ? – peroija

11

положить ScriptManager в свой MasterPage, что все ссылки на ваш ASPX-файл. Затем где-нибудь еще на сайте, который вам нужен для работы с ScriptManager, используйте ScriptManagerProxy, который получит ScriptManager с главной страницы и позволит вам работать с ним в пользовательском элементе управления и в коде.

Теперь вызов ScriptManager.GetCurrent (Страница) даст вам ссылку на диспетчера сценариев.

<asp:ScriptManagerProxy> 
    <Scripts> 
    <asp:ScriptReference Path="~/Scripts/myscript.js" /> 
    <Scripts> 
</asp:ScriptManagerProxy> 

Вот ссылка:

MSDN Info

+1

Извините, у меня нет главной страницы. Это существующая система, и нам не разрешено проходить через все существующие страницы ... Вот почему я пытаюсь использовать smarts в usercontrol. – cjserio

+0

Что будет ~/Scripts/myscript.js содержать? –

0

Я думаю, что это событие Init должно работать. Используйте описанную вами технику (то есть, проверяя, что ScriptManager.GetCurrent возвращает значение null перед добавлением), но когда вы добавляете ScriptManager, убедитесь, что вы добавили его в качестве первого элемента управления внутри формы.

Я не проверял это, но я думаю, что это сработает.

+0

Извините, как я уже сказал, событие Init даже не попало, потому что исключение выбрано ранее ... – cjserio

0

То, что сработало для меня было в том числе и эту строку после < формы>

<asp:ScriptManager ID="scriptManager" runat="server"/> 

Это заставило меня вокруг»... требует ScriptManager на странице. ScriptManager должен предстать перед какого-либо контроля, которые в этом нуждаются. "

0

Я сделал 2 вещи, которые работают.

На UserControl сделать этот Sub:

Public Sub SetFocus() 
    txtBox.Focus() 
End Sub 

На сайте caling, называют это перед вашим ScriptManagerCall

userControl.SetFocus() 

Если у вас есть AutoPostBack на вас UserControl вы также должны установить фокус в Событие TextChanged.

Protected Sub txtBox_TextChanged(ByVal sender As Object, ByVal e As System.EventArgs) Handles txtBox.TextChanged 
    txtBox.Focus() 
    ...... 
End Sub 

Надеюсь, что это сработает.