我有一个名为poDateCalendar的日历,我希望每当用户选择日历早于今天的日期时,就会产生如下响应:
protected void poDateCalendar_SelectionChanged(object sender, EventArgs e)
{
if (poDateCalendar.SelectedDate < System.DateTime.Today)
{
Response.Write("<script>alert('Warning: you are selecting a PO date earlier than today's date')</script>");
}
poDateCalendar.Visible = false;
poDateBtn.Text = poDateCalendar.SelectedDate.ToShortDateString();
}
这是我第一次尝试它,但不知何故现在它不再起作用了,有什么我做错了吗?
我也尝试过断点,它通过if语句并运行response.write
。但是,之后没有显示任何内容。
答案 0 :(得分:1)
只需用以下代码替换您的代码
Response.Write("<script> alert(\"Warning: you are selecting a PO date earlier than today's date\");</script>");
在您的情况下,您的代码失败了,因为您在“今天”中有一个单引号,这使您的代码失败。所以我在警报消息的开始和结束时使用转义序列。
答案 1 :(得分:0)
检查发送到浏览器的原始HTML。可能该脚本在打开html标记之前呈现。还没有页面或DOM,所以即使浏览器根本运行了javascript,也不知道如何处理它。
这是因为代码运行时您在ASP.Net Page Life Cycle的位置。 ASP.Net中的页面类通过首先构建所有控件和属性来获得正确的数据。然后,一旦完成,就会有一个渲染阶段,将这些控件转换为浏览器的HTML。在此呈现阶段之前,您发送到Response.Write()
的任何内容都将转到尚未向浏览器发送标头的响应流。
要解决此问题,请使用Page.RegisterStartupScript()
方法,而不是写入Response stream direclty。
答案 2 :(得分:0)
我不太明白 - 允许用户做他们不应该做的事情,然后在他们这样做时大喊大叫。 +留言箱/警报是老派的做事方式。这是一个糟糕的用户体验,恕我直言。
我在这里有一个更好的建议。您可以禁用以前的日期,以便他们无法在第一时间选择。您可以使用DayRender
事件。
<asp:Calendar ID="poDateCalendar" runat="server" OnDayRender="poDateCalendar_DayRender" />
在代码隐藏中:
protected void poDateCalendar_DayRender(object sender, DayRenderEventArgs e)
{
if (e.Day.Date < DateTime.Today)
{
e.Day.IsSelectable = false;
// Additionally grey out dates if you want
}
}