1

我有以下代码来比较两个日期与以下条件

设想:

  1. 加载时有两个带有 Ajax 日历扩展器的文本框(FromDate、ToDate)。
  2. On load From Date 显示今天的日期。
  3. 当在两个文本框(FromDate,ToDate)中选择小于今天的日期时,它会提醒用户说“您不能选择比今天早的一天!”
  4. 当 ToDate 的选定日期 < FromDate 的选定日期时,提醒用户说“To Date must be Greater than From date”。并同时清除 ToDate 文本框中选定的日期。

代码块:

ASP.NET , AJAX

                <asp:TextBox ID="txtFrom" runat="server"
                    ReadOnly="true"></asp:TextBox>
                <asp:ImageButton ID="imgBtnFrom" runat="server" ImageUrl="~/images/Cal20x20.png" Width="20" Height="20" ImageAlign="TextTop" />
                <asp:CalendarExtender ID="txtFrom_CalendarExtender" PopupButtonID="imgBtnFrom"
                    runat="server" Enabled="True" 
                    OnClientDateSelectionChanged="checkDate"
                    TargetControlID="txtFrom" Format="MMM d, yyyy">
                </asp:CalendarExtender>
                <asp:TextBox ID="txtTo" runat="server" 
                    ReadOnly="true"></asp:TextBox>
                <asp:ImageButton ID="imgBtnTo" runat="server" ImageUrl="~/images/Cal20x20.png" Width="20" Height="20" ImageAlign="TextTop" />
                <asp:CalendarExtender ID="txtTo_CalendarExtender"   
                    OnClientDateSelectionChanged="compareDateRange"
                    PopupButtonID="imgBtnTo"
                    runat="server" 
                    Enabled="True" TargetControlID="txtTo"
                    Format="MMM d, yyyy">
                </asp:CalendarExtender>
<asp:HiddenField ID="hdnFrom" runat="server" />
<asp:HiddenField ID="hdnTo" runat="server" />

C# 代码

protected void Page_Load(object sender, EventArgs e)
    {
        txtFrom.Text = string.Format("{0: MMM d, yyyy}", DateTime.Today);
        if (Page.IsPostBack)
        {
            if (!String.IsNullOrEmpty(hdnFrom.Value as string))
            {
                txtFrom.Text = hdnFrom.Value;
            }
            if (!String.IsNullOrEmpty(hdnTo.Value as string))
            {
                txtTo.Text = hdnTo.Value;
            }
        }
    }

JavaScript 代码

<script type="text/javascript">
        function checkDate(sender, args) {
            document.getElementById('<%=txtTo.ClientID %>').value = "";
            if (sender._selectedDate < new Date()) {
                alert("You cannot select a day earlier than today!");
                sender._selectedDate = new Date();
                // set the date back to the current date
                sender._textbox.set_Value(sender._selectedDate.format(sender._format));
                //assign the value to the hidden field.
                document.getElementById('<%=hdnFrom.ClientID %>').value = sender._selectedDate.format(sender._format);
                //reset the to date to blank.
                document.getElementById('<%=txtTo.ClientID %>').value = "";
            } else {
                document.getElementById('<%=hdnFrom.ClientID %>').value = sender._selectedDate.format(sender._format);
            }
        }
        function compareDateRange(sender, args) {
            var fromDateString = document.getElementById('<%=txtFrom.ClientID %>').value;
            var fromDate = new Date(fromDateString);
            if (sender._selectedDate < new Date()) {
                alert("You cannot select a Date earlier than today!");
                sender._selectedDate = "";
                sender._textbox.set_Value(sender._selectedDate)
            }
            if (sender._selectedDate <= fromDate) {
                alert("To Date must be Greater than From date.");
                sender._selectedDate = "";
                sender._textbox.set_Value(sender._selectedDate)
            } else {
                document.getElementById('<%=hdnTo.ClientID %>').value = sender._selectedDate.format(sender._format);
            }
        }
    </script>

错误屏幕(嗯:X)

现在在 ToDate 中,当您选择日期早于今天或日期小于 FromDate 时,ToDate 日历显示每个日期的 NaN 和年份的 ,0NaN

在此处输入图像描述

4

1 回答 1

0

看起来该format方法假设一个数字参数,但正在传递一个字符串参数。注释掉两个else块以确认这一点。由于以下原因,这些if块似乎总是返回:false

  • 由于这两个日期是字符串,所以比较的是它们的长度,而不是它们的日期
  • 在每个日期上使用Date.parse()进行数字比较
  • 使用硬编码值验证您的日期格式,例如 Date.parse("May 1, 1999")
于 2013-06-05T01:13:55.003 回答