3

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

开始日期字段:

<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>
4

3 回答 3

4

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

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

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

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

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

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

在没有测试过的情况下,您可以尝试使用一个隐藏的 TextBox( display:none),并将接受的日期格式作为文本。然后将验证器设置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>
于 2012-03-16T11:21:38.240 回答
0

除了 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);
}
于 2013-03-26T11:16:41.437 回答
0

对于日期格式 MM/dd/yyyy

把它放在 Web.Config

<globalization culture="en-us"/> 

在下面

<system.web>
于 2014-10-15T11:56:38.703 回答