ASP.NET C# AJAX 控件倒数计时器仅在对将来时间进行硬编码时才有效



我有一个 AJAX C# ASP.NET 控件,它可以正常工作(仅当日期时间被硬编码时,它才会从当前时间倒计时 2 小时。我想将日期作为变量传入,但每次我这样做时,计时器都会停止工作。

这是有效的方法...

protected void Timer1_Tick(object sender, EventArgs e)
{
String DateTimeFuture = DateTime.Now.AddHours(2).ToString();
DateTime NeededByDateTime = DateTime.Parse("03/18/2017 10:00:00 AM");
TimeSpan time1 = new TimeSpan();
time1 = NeededByDateTime - DateTime.Now;
if ((time1.Hours == 0) && (time1.Minutes == 0) && (time1.Seconds == 0))
{
Label1.Text = "Time Expired!";
//Return article to results
}
else
{
string countDown = string.Format("{0} Days, {1} Hours, {2} Minutes, {3} Seconds til launch.", time1.Days, time1.Hours, time1.Minutes, time1.Seconds);
Label1.Text = countDown.ToString();
}
}

这是不起作用的...

protected void Timer1_Tick(object sender, EventArgs e)
{
String DateTimeFuture = DateTime.Now.AddHours(2).ToString();
DateTime NeededByDateTime = DateTime.Parse(DateTimeFuture);
TimeSpan time1 = new TimeSpan();
time1 = NeededByDateTime - DateTime.Now;
if ((time1.Hours == 0) && (time1.Minutes == 0) && (time1.Seconds == 0))
{
Label1.Text = "Time Expired!";
}
else
{
string countDown = string.Format("{0} Days, {1} Hours, {2} Minutes, {3} Seconds til launch.", time1.Days, time1.Hours, time1.Minutes, time1.Seconds);
Label1.Text = countDown.ToString();
}
}

关于为什么它不适用于第二段代码的任何想法?

更新:

如果要尝试使该示例适用于您的环境,则需要在页面中使用以下代码。

<form method="post" runat="server" action="Page.aspx">
<asp:ScriptManager ID="ScriptManager1" runat="server" />
<asp:UpdatePanel ID="UpdatePanel1" Visible="true" runat="server" >
<ContentTemplate>
<asp:Timer ID="Timer1" runat="server" Interval="1000" OnTick="Timer1_Tick">
</asp:Timer>
<asp:Label ID="Label1" runat="server"></asp:Label>
</ContentTemplate>
</asp:UpdatePanel>
</form>

到底什么不起作用?它是否引发异常。解析日期后,contentNeedByDateTime 变量的值是多少?正确吗?

当前区域性可能存在问题。因此,为了确保将正确的格式传递给解析器,而不是 ToString(),请使用一些显式格式:http://www.csharp-examples.net/string-format-datetime/

我假设这只是一个测试代码,您将把变量作为字符串参数传递。因此,您只需要确保以正确的格式传递值。

更新

根据下面的评论,我对这个问题有了更多的了解。您不能在方法中声明日期,因为每次调用此方法时都会更新日期,这可能是每秒更新一次。如果您希望能够为每个用户倒计时。获取用户使用计时器请求页面并将其保存到会话的日期和时间:

Session["NeededByDateTime"] = DateTime.Now.AddHours(2);

然后该方法将如下所示:

protected void Timer1_Tick(object sender, EventArgs e)
{
//for the sake of simplicity but you should check if it exists first
DateTime NeededByDateTime = (DateTime)Session["NeededByDateTime"]; 
time1 = NeededByDateTime - DateTime.Now;
if ((time1.Hours == 0) && (time1.Minutes == 0) && (time1.Seconds == 0))
{
Label1.Text = "Time Expired!";
}
else
{
string countDown = string.Format("{0} Days, {1} Hours, {2} Minutes, {3} Seconds til launch.", time1.Days, time1.Hours, time1.Minutes, time1.Seconds);
Label1.Text = countDown.ToString();
}
}

您的示例不起作用,因为每次Timer调用Tick方法时time1总是等于 2 小时。

protected void Timer1_Tick(object sender, EventArgs e)
{
String DateTimeFuture = DateTime.Now.AddHours(2).ToString(); // NOW + 2 HOURS
DateTime NeededByDateTime = DateTime.Parse(DateTimeFuture);
TimeSpan time1 = new TimeSpan();
time1 = NeededByDateTime - DateTime.Now; // NOW + 2 HOURS - NOW = 2 HOURS
if ((time1.Hours == 0) && (time1.Minutes == 0) && (time1.Seconds == 0))
{
Label1.Text = "Time Expired!";
}
else
{
string countDown = string.Format("{0} Days, {1} Hours, {2} Minutes, {3} Seconds til launch.", time1.Days, time1.Hours, time1.Minutes, time1.Seconds);
Label1.Text = countDown.ToString();
}
}

您应该在Tick方法之外声明NeededByDateTime变量,以便它保持不变,并且不会在每次报价时更新。

private DateTime NeededByDateTime = DateTime.Now.AddHours(2); //.., or whatever you want 
protected void Timer1_Tick(object sender, EventArgs e)
{
TimeSpan time1 = NeededByDateTime - DateTime.Now;
if ((time1.Hours == 0) && (time1.Minutes == 0) && (time1.Seconds == 0))
{
Label1.Text = "Time Expired!";
}
else
{
string countDown = string.Format("{0} Days, {1} Hours, {2} Minutes, {3} Seconds til launch.", time1.Days, time1.Hours, time1.Minutes, time1.Seconds);
Label1.Text = countDown.ToString();
}
}

最新更新