如何使用 asp.net 计时器控件停止倒数计时器?
How do I stop countdown timer using asp.net timer control?
我在我的项目中插入了一个倒数计时器。当我 运行 它时,计时器启动,但当我停止调试它时,一段时间后我再次 运行 它然后我注意到,计时器仍然是 运行ning。例如,我给计时器设置了 3 分钟的时间,即 3 分钟后它应该重定向到结果页面......现在我 运行 页面和倒计时计时器开始......当我停止调试时它假设在 00:02:45(剩余时间) 和 5 秒后当我再次 运行 它然后计时器继续 00:02:40(剩余时间) 。
我不希望这样的事情发生。如何停止计时器的继续?
看看我的代码。告诉我我在哪里犯了错误以及解决方案是什么。
在TimerTest.aspx.cs页面上,我有以下几行代码:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Data.SqlClient;
using System.Data;
using System.Configuration;
public partial class Student_TimerTest : System.Web.UI.Page
{
protected void Page_Load(object sender, EventArgs e)
{
if (Session["end_t"] == null)
{
DateTime start_time = DateTime.Now;
DateTime end_time = start_time.AddMinutes(3);
Session["end_t"] = end_time;
}
}
protected void timer1_tick(object sender, EventArgs e)
{
DateTime dt = (DateTime)Session["end_t"];
DateTime dt_curr = DateTime.Now;
TimeSpan ts = dt - dt_curr;
lblTimer.Text = ts.Hours.ToString() + ":" + ts.Minutes.ToString() + ":" + ts.Seconds.ToString();
if (ts.Minutes == 0)
{
timer1.Enabled = false;
Response.Redirect("/Student/Result.aspx");
}
}
}
在 TimerTest.aspx 页面上,我插入了以下代码行:
<%@ Page Language="C#" AutoEventWireup="true" CodeFile="TimerTest.aspx.cs" Inherits="Student_TimerTest" %>
<!DOCTYPE html>
<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>
</div>
</form>
</body>
</html>
说定时器还是运行有点误导。退出调试后实际上没有任何代码运行。 但是,您将开始时间存储在会话状态中,默认情况下,会话状态存储在浏览器中。如果您停止调试然后重新启动,您的 Web 应用程序的 应用程序实例 将重新启动,但您的 浏览器 会保留会话状态。所以你的浏览器仍然有旧的开始时间。因此,在页面加载时,行 if (Session["end_t"] == null)
导致 false。 那里有一个值。
这里有很多选项,但如果不是 post,则总是在页面加载时清除该值。如果它 是 一个 post 返回,只需检查会话中是否已经有一个值。
示例代码:
protected void Page_Load(object sender, EventArgs e)
{
// If this is the initial page load (not a post back),
// or if there's not already an end time in Session,
// then set the end time
if (!Page.IsPostBack || Session["end_t"] == null)
{
DateTime start_time = DateTime.Now;
DateTime end_time = start_time.AddMinutes(3);
Session["end_t"] = end_time;
}
}
我在我的项目中插入了一个倒数计时器。当我 运行 它时,计时器启动,但当我停止调试它时,一段时间后我再次 运行 它然后我注意到,计时器仍然是 运行ning。例如,我给计时器设置了 3 分钟的时间,即 3 分钟后它应该重定向到结果页面......现在我 运行 页面和倒计时计时器开始......当我停止调试时它假设在 00:02:45(剩余时间) 和 5 秒后当我再次 运行 它然后计时器继续 00:02:40(剩余时间) 。 我不希望这样的事情发生。如何停止计时器的继续? 看看我的代码。告诉我我在哪里犯了错误以及解决方案是什么。
在TimerTest.aspx.cs页面上,我有以下几行代码:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Data.SqlClient;
using System.Data;
using System.Configuration;
public partial class Student_TimerTest : System.Web.UI.Page
{
protected void Page_Load(object sender, EventArgs e)
{
if (Session["end_t"] == null)
{
DateTime start_time = DateTime.Now;
DateTime end_time = start_time.AddMinutes(3);
Session["end_t"] = end_time;
}
}
protected void timer1_tick(object sender, EventArgs e)
{
DateTime dt = (DateTime)Session["end_t"];
DateTime dt_curr = DateTime.Now;
TimeSpan ts = dt - dt_curr;
lblTimer.Text = ts.Hours.ToString() + ":" + ts.Minutes.ToString() + ":" + ts.Seconds.ToString();
if (ts.Minutes == 0)
{
timer1.Enabled = false;
Response.Redirect("/Student/Result.aspx");
}
}
}
在 TimerTest.aspx 页面上,我插入了以下代码行:
<%@ Page Language="C#" AutoEventWireup="true" CodeFile="TimerTest.aspx.cs" Inherits="Student_TimerTest" %>
<!DOCTYPE html>
<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>
</div>
</form>
</body>
</html>
说定时器还是运行有点误导。退出调试后实际上没有任何代码运行。 但是,您将开始时间存储在会话状态中,默认情况下,会话状态存储在浏览器中。如果您停止调试然后重新启动,您的 Web 应用程序的 应用程序实例 将重新启动,但您的 浏览器 会保留会话状态。所以你的浏览器仍然有旧的开始时间。因此,在页面加载时,行 if (Session["end_t"] == null)
导致 false。 那里有一个值。
这里有很多选项,但如果不是 post,则总是在页面加载时清除该值。如果它 是 一个 post 返回,只需检查会话中是否已经有一个值。
示例代码:
protected void Page_Load(object sender, EventArgs e)
{
// If this is the initial page load (not a post back),
// or if there's not already an end time in Session,
// then set the end time
if (!Page.IsPostBack || Session["end_t"] == null)
{
DateTime start_time = DateTime.Now;
DateTime end_time = start_time.AddMinutes(3);
Session["end_t"] = end_time;
}
}