在 asp.net 中维护基于 ajax 的倒数计时器的状态

Posted

技术标签:

【中文标题】在 asp.net 中维护基于 ajax 的倒数计时器的状态【英文标题】:Maintaining state of ajax based countdown timer in asp.net 【发布时间】:2013-09-13 16:45:12 【问题描述】:

我在 Code Project 上的会员 4332221 在 Internet 上的代码的帮助下创建了一个倒数计时器,其中包含一些更新,我正在一个项目中使用这个计时器进行在线测试

下面是代码

aspx 代码

<div>
<asp:ScriptManager ID= "SM1" runat="server"></asp:ScriptManager>
<asp:Timer ID="timer1" runat="server" 
Interval="1000" OnTick="timer1_tick"></asp:Timer>
</div>

<div>
<asp:UpdatePanel id="updPnl" 
runat="server" UpdateMode="Conditional">
<ContentTemplate>
<asp:Label ID="lblTimer" runat="server"></asp:Label>
</ContentTemplate>
<Triggers>
<asp:AsyncPostBackTrigger ControlID="timer1" EventName ="tick" />
</Triggers>
</asp:UpdatePanel>
</div>

aspx.cs

protected void Page_Load(object sender, EventArgs e)

    if (!SM1.IsInAsyncPostBack)
        Session["timeout"] = DateTime.Now.AddMinutes(1).ToString();


protected void timer1_tick(object sender, EventArgs e)

    if (0 > DateTime.Compare(DateTime.Now,
    DateTime.Parse(Session["timeout"].ToString())))
    
        int hrs = (((Int32)DateTime.Parse(Session["timeout"].
        ToString()).Subtract(DateTime.Now).TotalMinutes)) / 60;

        int mins = (((Int32)DateTime.Parse(Session["timeout"].
        ToString()).Subtract(DateTime.Now).TotalMinutes)) % 60;

        int seconds = (((Int32)DateTime.Parse(Session["timeout"].
        ToString()).Subtract(DateTime.Now).TotalSeconds))%60;


        lblTimer.Text = "Time left is " + hrs.ToString() + " : " + mins.ToString() + " : " + seconds.ToString();

        if (hrs == 0 && mins == 0 && seconds == 0)
        
            lblTimer.Text = "Test Time Over";
        
    

如果我单独运行此代码,它可以正常工作,但问题是,如果我将它应用到我想在按钮单击事件上启动它的模块中,它只能工作一次,并且在单击任何其他按钮时计时器会运行回到初始位置。

我尝试申请Postback = false,但计时器没有显示。

如何在按钮单击时加载此计时器并在其他控件的单击事件中保持其状态

【问题讨论】:

【参考方案1】:

只需将您的 Page_Load 事件更改为以下 .. 我刚刚添加了一个条件 (Session["timeout"] == null || Convert.ToString(Session["timeout"]).Trim() == "")

这是我的aspx代码


<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
    <title></title>
</head>
<body>
    <form id="form1" runat="server">
    <div>
        <asp:ScriptManager ID="SM1" runat="server">
        </asp:ScriptManager>
        <asp:Timer ID="timer1" runat="server" Interval="1000" OnTick="timer1_tick">
        </asp:Timer>
    </div>
    <div>
        <asp:UpdatePanel ID="updPnl" runat="server" UpdateMode="Conditional">
            <ContentTemplate>
                <asp:Label ID="lblTimer" runat="server"></asp:Label>
            </ContentTemplate>
            <Triggers>
                <asp:AsyncPostBackTrigger ControlID="timer1" EventName="tick" />
            </Triggers>
        </asp:UpdatePanel>
        <asp:Button ID="btn2" runat="server" Text="Clickkkk" onclick="btn2_Click" />
    </div>
    </form>
</body>
</html>

以下是我的 .cs 代码,如您所见,我已经有按钮,并且单击按钮时值保持不变


  protected void Page_Load(object sender, EventArgs e)
    
        if (!SM1.IsInAsyncPostBack && (Session["timeout"] == null || Convert.ToString(Session["timeout"]).Trim() == ""))
            Session["timeout"] = DateTime.Now.AddMinutes(3).ToString();
    
    protected void timer1_tick(object sender, EventArgs e)
    
        if (0 > DateTime.Compare(DateTime.Now,
        DateTime.Parse(Session["timeout"].ToString())))
        
            int hrs = (((Int32)DateTime.Parse(Session["timeout"].
            ToString()).Subtract(DateTime.Now).TotalMinutes)) / 60;

            int mins = (((Int32)DateTime.Parse(Session["timeout"].
            ToString()).Subtract(DateTime.Now).TotalMinutes)) % 60;

            int seconds = (((Int32)DateTime.Parse(Session["timeout"].
            ToString()).Subtract(DateTime.Now).TotalSeconds)) % 60;


            lblTimer.Text = "Time left is " + hrs.ToString() + " : " + mins.ToString() + " : " + seconds.ToString();

            if (hrs == 0 && mins == 0 && seconds == 0)
            
                lblTimer.Text = "Test Time Over";
            
        
    

    protected void btn2_Click(object sender, EventArgs e)
    
        Response.Write("asdasdsa");
    

【讨论】:

感谢达瓦尔!但它不起作用,我试图在之前应用于 Page_Load 的按钮单击事件上触发此事件 表示你不想在 page_load 上看到这个 不!我希望它在按钮单击时也我想在任何其他按钮单击时保持其状态 我无法理解您的要求.. 抱歉.. 但我正在输入我的测试项目代码.. 它可能对您有所帮助 谢谢!我希望它会有所帮助,你会把它放在哪里

以上是关于在 asp.net 中维护基于 ajax 的倒数计时器的状态的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 asp.net 创建 2 分钟倒数计时器

Asp.Net MVC Unobtrusive Ajax

在 ASP.Net 中设计网站 - 用户登录设计和注意事项

ASP.NET 页面上的倒数计时器

ASP.NET中JQuery+AJAX调用后台

基于.Net Framework 4.0 Web API开发:ASP.NET Web APIs AJAX 跨域请求解决办法(CORS实现)