Это проблема, с которой я столкнулся в веб-приложении, над которым я сейчас работаю.
Поэтому вместо того, чтобы загромождать вопрос несвязанным кодом, я воссоздал проблему в изолированном упрощенном веб-приложении, которое только демонстрирует эту проблему.
Надеюсь, это поможет найти решение.
У меня есть веб-пользовательский элемент управления, в котором в качестве содержимого используется следующее:
<% if (ShowAlertScript)
{ %>
<script type="text/javascript">
function AlertMe()
{
alert('Hello World!');
}
</script>
<% } %>
<input type="button" onclick="AlertMe()" value="Say Hello" />
И его внутренний код содержит не что иное, как логическое определение ShowAlertScript
.
Это представляет собой элемент управления, который у меня есть в большом веб-приложении, которое имеет два режима: режим ввода и режим отображения . В режиме ввода он имеет большой блок javascript, который полезен только тогда; он делает кое-что интересное, чтобы помочь пользователю ввести информацию.
Этот элемент управления представлен на общей картинке следующим образом:
<asp:ScriptManager runat="server" />
<asp:UpdatePanel runat="server">
<ContentTemplate>
<asp:MultiView ActiveViewIndex="0" runat="server" ID="mvw">
<asp:View runat="server">
<asp:Button runat="server" ID="btnSwitch"
OnClick="btnSwitch_Click" Text="Switch" />
</asp:View>
<asp:View runat="server">
<uc:MyInputControl runat="server" ID="micInput" ShowAlertScript="true" />
</asp:View>
</asp:MultiView>
</ContentTemplate>
</asp:UpdatePanel>
Когда вы нажимаете btnSwitch
, он просто переключается на второй вид с пользовательским элементом управления.
Обратите внимание, как у меня ShowAlertScript
уже инициализирован как true
.
Возможный результат состоит в том, что, поскольку я «показываю сценарий предупреждения» в пользовательском элементе управления, функция AlertMe ()
будет выполняться, когда вы щелкаете элемент input-button
, потому что он записано в соответствии со встроенным оператором if
.
Если вы запустите этот код, который я дал вам как есть, он не будет работать.
Браузер сообщит, что не видит функцию AlertMe ()
; насколько ему известно, он не определен.
Но если вы удалите UpdatePanel
(или отключите частичный рендеринг ScriptManager
), он будет нормально работать при полной обратной передаче, когда вы нажмете btnSwitch
.
Я хочу, чтобы он работал с частичной обратной передачей, потому что все это - небольшой кусок по сравнению с остальной частью страницы, и я не хочу выполнять полную обратную передачу каждый раз, когда они переключают представления.
По-видимому, ScriptManager
даже не беспокоится о повторной визуализации файла ascx для возможных изменений.
Либо ScriptManager
недостаточно умен, либо мне не хватает опции, позволяющей ему отображать