1

次の条件で2つの日付を比較する次のコードがあります

シナリオ:

  1. 読み込み時には、Ajax カレンダー エクステンダーを含む 2 つのテキスト ボックス (FromDate、ToDate) があります。
  2. On load From Date には、今日の日付が表示されます。
  3. 両方のテキスト ボックス (FromDate、ToDate) で今日より前の日付を選択すると、「今日より前の日は選択できません!」という警告が表示されます。
  4. ToDate の選択日 < FromDate の選択日である場合、「To Date は 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、次の理由で常に返されるようです。

  • 2 つの日付は文字列であるため、日付ではなく長さが比較されます。
  • 数値比較を行うには、各日付でDate.parse()を使用します
  • Date.parse("May 1, 1999") などのハードコードされた値で日付形式を検証します。
于 2013-06-05T01:13:55.003 に答える