【问题标题】:Using CompareValidator and CalenderExtender with unsupported date-format使用不支持的日期格式的 CompareValidator 和 CalenderExtender
【发布时间】:2012-04-01 21:52:51
【问题描述】:

我在表单中有一个开始日期和结束日期字段。我已经指定了日历扩展器的格式。从那时起,比较验证器就不起作用了。它总是显示错误消息。请帮忙。我需要以“Fri 04 May 2012”的格式显示日期。

开始日期字段:

<asp:TextBox ID="txtStartDate" ReadOnly="true" runat="server" 
    CssClass="textBoxWidth TPRValue" Text='<%#DataBinder.Eval(Container.DataItem, "StartDate", "{0: ddd MM dd, yyyy}")%>'>
</asp:TextBox>
<asp:ImageButton ID="imgBtnStartDate" runat="server" ImageUrl="~/Common/Images/Calendar.GIF" CausesValidation="false" ImageAlign="AbsMiddle" />
<ajax:CalendarExtender ID="StartDateCalendar" TargetControlID="txtStartDate" PopupButtonID="imgBtnStartDate" runat="server" 
    Format="ddd MM dd, yyyy">
</ajax:CalendarExtender>
<asp:CompareValidator ID="startDateCompareValidator" runat="server" ControlToValidate="txtStartDate" ControlToCompare="txtEndDate" Enabled="true" 
    Type="Date" Display="Dynamic" Operator="LessThanEqual"
    Text="Startdate should be <= enddate">
</asp:CompareValidator>

结束日期字段:

<asp:TextBox ID="txtEndDate" ReadOnly="true" runat="server" 
    CssClass="textBoxWidth TPRValue" Text='<%#DataBinder.Eval(Container.DataItem, "EndDate", "{0: ddd MM dd, yyyy}")%>'>
</asp:TextBox>
<asp:ImageButton ID="imgBtnEndDate" runat="server" ImageUrl="~/Common/Images/Calendar.GIF" CausesValidation="false" ImageAlign="AbsMiddle" />
<ajax:CalendarExtender ID="EndDateCalendar" TargetControlID="txtEndDate" PopupButtonID="imgBtnEndDate" runat="server" 
    Format="ddd MM dd, yyyy">
</ajax:CalendarExtender>

比较验证器:

<asp:CompareValidator ID="startDateCompareValidator" runat="server" ControlToValidate="txtStartDate" 
    ControlToCompare="txtEndDate" Enabled="true" Type="Date" Display="Dynamic" Operator="LessThanEqual"
    Text="Startdate should be <= enddate">
</asp:CompareValidator>

【问题讨论】:

    标签: asp.net calendarextender


    【解决方案1】:

    我假设CompareValidator 不接受您的格式。

    CompareValidator 对它接受的日期非常特别。例如,以下日期被视为无效:

    • 2001 年 1 月 1 日
    • 2001 年 1 月 1 日
    • 2012 年 5 月 4 日星期五

    CompareValidator 需要一个如下所示的日期:

    • 2001 年 1 月 1 日
    • 1-1-2001
    • 2012 年 5 月 4 日

    http://www.informit.com/articles/article.aspx?p=25461&seqNum=5

    在没有测试的情况下,您可以尝试使用隐藏的 TextBox(display:none),其接受的日期格式为 Text。然后将验证器的ControlToValidate 设置为“隐藏字段”。您需要将两个 TextBox 的 Text 属性与其隐藏字段同步。也许这会给你一个想法。

    编辑:好的,我已经按照我所说的尝试让它工作,实际上它正在工作:) 也许有一些重构可能,但你自己看看。

    使用我使用 CSS 的工作日期格式隐藏文本框:

    <style type="text/css">
        .hidden
        {
            display:none;   
        }
    </style>
    

    当用户通过 CalendarExtenders 更改日期时会调用这些 JS 函数:

    <script type="text/javascript">
        function dateChangedStart(sender, args) {
            var selectedDate = sender.get_selectedDate();
            var hiddenStart = $get("txtStartDateHidden");
            var validator = $get("startDateCompareValidator");
            hiddenStart.value = dateToString(selectedDate);
            ValidatorValidate(validator);
        }
        function dateChangedEnd(sender, args) {
            var selectedDate = sender.get_selectedDate();
            var hiddenEnd = $get("txtEndDateHidden");
            var validator = $get("startDateCompareValidator");
            hiddenEnd.value = dateToString(selectedDate);
            ValidatorValidate(validator);
        }
        function dateToString(d) {
            var year = d.getFullYear();
            var month = d.getMonth() + 1; //months are zero based
            var day = d.getDate();
            return year + "/" + month + "/" + day;
        }
    </script>
    

    这是示例页面的其余部分:

    <div>
        <asp:TextBox ID="txtStartDate" CausesValidation="false" ReadOnly="true" runat="server">
        </asp:TextBox>
        <asp:TextBox ID="txtStartDateHidden" CssClass="hidden" ValidationGroup="DateCheck" CausesValidation="true" ReadOnly="false" runat="server">
        </asp:TextBox>
        <ajax:CalendarExtender ID="StartDateCalendar" TargetControlID="txtStartDate" runat="server"
            OnClientDateSelectionChanged="dateChangedStart"
            Format="ddd MM dd, yyyy">
        </ajax:CalendarExtender>
        <asp:CompareValidator ID="startDateCompareValidator" runat="server" EnableClientScript="true"
            ControlToValidate="txtStartDateHidden" Display="Static" Operator="LessThanEqual" ValidationGroup="DateCheck"
            ControlToCompare="txtEndDateHidden" Enabled="true" Type="Date" Text="Startdate should be <= enddate">
        </asp:CompareValidator>
        <asp:TextBox ID="TxtEndDate" CausesValidation="false" ReadOnly="true" runat="server">
        </asp:TextBox>
        <asp:TextBox ID="txtEndDateHidden" CssClass="hidden" ValidationGroup="DateCheck" CausesValidation="true" ReadOnly="false" runat="server">
        </asp:TextBox>
        <ajax:CalendarExtender ID="EndDateCalendar" TargetControlID="txtEndDate" runat="server"
            OnClientDateSelectionChanged="dateChangedEnd"
            Format="ddd MM dd, yyyy">
        </ajax:CalendarExtender>
        <asp:Button ID="BtnSubmit" CausesValidation="true" ValidationGroup="DateCheck" runat="server" Text="Submit" />
    </div>
    

    【讨论】:

    • 隐藏字段和文本框如何同步?一旦用户从日历控件中选择日期,它应该被分配给文本框和隐藏字段。必须尝试 javascript
    • @user1107973:我尝试过演示,它显然有效,看看我编辑的答案。
    • @TimSchmelter 我试图让上面的代码在我的网页上运行,但我认为你根本没有触发 javascript 代码。 OnClientDateSelectionChanged="dateChangedStart" 不应该是 OnClientDateSelectionChanged="dateChangedStart()" 但带有一些 javascript 预期的参数吗?
    • 也不应该在 END 日期启动验证器,因为可能并不总是在 START 日期之前提供结束日期。我只是不明白你如何声称上述工作。
    • @Fernando68:我不明白你的反对意见。这是很久以前的事了,我现在无法测试它,但我正在使用CalendarExtenders OnClientDateSelectionChanged 事件。 StartDateCalendar-calendar 触发 dateChangedStartEndDateCalendar 触发 dateChangedEnd。我提供了一个完整的工作示例页面。
    【解决方案2】:

    除了Tim的回答,想用jQuery的朋友们:

    function dateChangedStart(sender, args) {
        var selectedDate = sender.get_selectedDate();
        var hiddenStart = $('input[id$=txtStartDateHidden]');
        var validator = $('span[id$=startDateCompareValidator]');
        hiddenStart.val(dateToString(selectedDate));
    
        var validatorAsDOM = validator.get(0);
        ValidatorValidate(validatorAsDOM);
    }
    

    【讨论】:

    • 是的,但是您是否尝试在示例项目中使用 Tim 的答案?他的代码连JS代码都不会调用,那跟jquery有什么区别呢?
    • @Fernando68:你还没有尝试过。 js 函数被触发是因为它们是事件处理程序,例如:OnClientDateSelectionChanged="dateChangedStart"。你用过 Ajax-CalendarExtenders 吗?
    【解决方案3】:

    对于日期格式 MM/dd/yyyy

    把它放在 Web.Config 中

    <globalization culture="en-us"/> 
    

    <system.web>
    

    【讨论】:

      猜你喜欢
      • 2015-07-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-11-20
      • 1970-01-01
      相关资源
      最近更新 更多