我正在编写一个ASP.Net Web窗体应用程序,它有几个慢速的后端操作,所以我试图使用UpdatePanels来异步执行操作。
我希望这些操作一次只能执行一次,并在有人执行其中一项操作时通知其他用户。作为一种快速而肮脏的方式,我想建立一个带有掩码的简单模态对话框,在操作发生时禁止访问该站点。我在网站的所有页面共享的MasterPage中执行此操作。
我将模式放在UpdatePanel中,并在其上放置一个计时器来检查全局变量(来自ApplicationState)的当前状态。如果它正在执行任务,则显示模态,否则通过设置Visibility = False将其禁用。我只希望更新内容,因此我在ScriptManager中确保EnablePartialRendering =“true”,并在UpdatePanel上设置UpdateModel =“Contitional”。我甚至在Timer的Tick事件中调用.Update()。
对我来说听起来不错。为了测试,我得到了随机打开和关闭的模态。到目前为止,计时器工作一个款待,模态显示和隐藏像一个冠军。唯一的问题是,在第二次隐藏模态后,一切都会消失。
所以......为了存在,隐藏了模态,主页面显示正常。然后计时器触发,显示模态,漂亮地覆盖主页面。计时器再次触发,模态消失,但其他一切都消失了!
我在Chrome中检查了'inspect element'后面的活动html源代码,内容已经消失了!
我在这里遗漏了一些非常明显的东西......
这是我的代码:
<%@ 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();
}
Senseis!这只小蚂蚱做错了什么?
我不认为这与它有任何关系,但我的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中的内容消失了。
答案 0 :(得分:0)
您应该再次将控件添加到更新面板内的页面,否则母版页的加载功能会清除控件,因此这些控件的操作不再起作用
答案 1 :(得分:0)
通过对这个问题的所有搜索,我发现每次在处理DIV标签格式错误时都可以解决该问题。
请参见this post.
答案 2 :(得分:0)
就我而言,AsyncPostBackTrigger ControlID不正确。计时器引起了回发,但是由于计时器不是UpdatePanel的触发器,因此实际上没有更新带有条件模式的UpdatePanel。
<Triggers>
<asp:AsyncPostBackTrigger controlid="CheckTimer" eventname="Tick" />
</Triggers>
(我知道这是一篇古老的文章,但这是我在搜索结果中遇到的问题。在此发布以希望对某人有所帮助。