Я пишу приложение ASP.Net Web Forms, в котором есть несколько медленных внутренних операций, поэтому я пытаюсь использовать UpdatePanels для асинхронного выполнения операций.
Я хочу, чтобы эти операции выполнялисьбыть исполняемым только по одному и сообщать другим пользователям, когда кто-то выполняет одну из этих операций.В качестве быстрого и грязного способа сделать это, я хочу открыть простой модальный диалог с маской за ним, блокирующий доступ к сайту во время выполнения операции.Я делаю это в MasterPage, который используется на всех страницах сайта.
Я вставил модал в UpdatePanel и установил таймер, чтобы проверить глобальную переменную (из ApplicationState) на текущий статус.Если он выполняет задачу, отобразите модальный режим, иначе отключите его, установив Visibility = FalseЯ только хочу, чтобы это содержимое обновлялось, поэтому я обеспечиваю EnablePartialRendering = "true" в моем ScriptManager и устанавливаю UpdateModel = "Contitional" на UpdatePanel.Я даже вызываю .Update () в событии Timer Tick.
Звучит довольно хорошо для меня.Чтобы проверить, я получаю модал для случайного включения и выключения.До сих пор таймер работает, а модал отображает и прячет как чемпион.Единственная проблема в том, что после второго раза, когда модал скрыт, ВСЕ исчезает.
Так ... чтобы быть, модал скрыт, главная страница отображается нормально.Затем срабатывает таймер, отображается модал, красиво накладывающийся на главную страницу.Таймер снова срабатывает, и модальный режим исчезает, но так же и все остальное!
Я проверяю активный источник html позади 'inspect element' в Chrome, и содержимое исчезает!
I 'Здесь я упускаю что-то очень очевидное ...
Это мой код:
<%@ Master Language="C#" AutoEventWireup="true" CodeBehind="Site.master.cs" Inherits="OPTH.DesktopRollout.Website.SiteMaster" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en">
<head runat="server">
<title></title>
<link href="~/Styles/Site.css" rel="stylesheet" type="text/css" />
<asp:ContentPlaceHolder ID="HeadContent" runat="server">
</asp:ContentPlaceHolder>
</head>
<body>
<form runat="server">
<asp:ScriptManager ID="MainSM" runat='server' EnablePartialRendering="True" />
<asp:Timer runat="server" ID="CheckTimer" Interval="500" OnTick="CheckTimer_Tick"></asp:Timer>
<asp:UpdatePanel runat="server" ID="ModalUp" UpdateMode="Conditional" RenderMode="Block" >
<Triggers>
<asp:AsyncPostBackTrigger controlid="CheckTimer" eventname="Tick" />
</Triggers>
<ContentTemplate>
<asp:Panel id="modalPnl" runat="server">
<div class="modalPopup">
<div id="modalContent">Currently performing task: '<asp:Literal runat="server" ID="TaskNameLtr" />'. Please wait till it has completed before continuing.</div>
</div>
<div class="modalOverlay" />
</asp:Panel>
</ContentTemplate>
</asp:UpdatePanel>
//... other content is here... just static html and a ContentPlaceHolder for basepage.
Код бэкенда:
protected void CheckTimer_Tick(object sender, EventArgs e)
{
modalPnl.Visible = IsExecutingTask; //Returns a random true or false based on time.
TaskNameLtr.Text = DateTime.Now.ToShortDateTimeString();
ModalUp.Update();
}
Сенсей!Что этот молодой кузнечик делает неправильно?
Не думаю, что это как-то связано с этим, но мой CSS:
.modalOverlay
{
position: fixed;
width: 100%;
height: 100%;
background-color: black;
z-index: 1;
filter: alpha(opacity=50); /* internet explorer */
-khtml-opacity: 0.5; /* khtml, old safari */
-moz-opacity: 0.5; /* mozilla, netscape */
opacity: 0.5; /* fx, safari, opera */
}
.modalPopup
{
position: fixed;
margin-left: -225px;
top: 40%;
left: 50%;
width: 450px;
height:100px;
background-color: white;
border: black solid 3px;
z-index: 2;
filter: alpha(opacity=100); /* internet explorer */
-khtml-opacity: 1; /* khtml, old safari */
-moz-opacity: 1; /* mozilla, netscape */
opacity: 1; /* fx, safari, opera */
}
.modalPopup #modalContent
{
margin: 15px 30px;
}
Есть идеи?
ОБНОВЛЕНИЕЯ только что переместил весь код AJAX из MasterPage в Default.aspx.Теперь при асинхронной обратной передаче содержимое из Masterpage остается, но содержимое из Default.aspx исчезает.