ASP.NET验证器实现日期验证

67

我正在尝试使用ASP.NET的RangeValidator对文本框中输入的日期进行验证,日期的格式为dd MMMM yyyy

我该如何使用范围验证器来验证有效日期?如果将 1 January 1000 输入为最小值或最大值,那么就会出现“值无法转换为日期类型”的错误,但是如果我使用其他格式,它就能检测到我输入的文本无效。

以下是我的代码:

<asp:TextBox 
    runat="server" 
    ID="txtDatecompleted" 
/>
<cc2:CalendarExtender
    ID="datecompletedExtender" 
    runat="server"
    TargetControlID="txtDatecompleted"
    Format="dd MMMM yyyy"
/>  
<asp:RangeValidator 
    runat="server" 
    ID="RangeValidator1" 
    Type="Date" 
    ControlToValidate="txtDatecompleted" 
    MaximumValue="9999/12/28" 
    MinimumValue="1000/12/28" 
    ErrorMessage="enter valid date" 
    Display="None"
/>
<cc2:ValidatorCalloutExtender 
    ID="RangeValidator1_ValidatorCalloutExtender" 
    runat="server"
    Enabled="True"
    TargetControlID="RangeValidator1">
</cc2:ValidatorCalloutExtender>

你在尝试验证格式吗?因为我不理解你的问题。 - TStamper
4个回答

138

最好的选择是

在Web表单中添加一个CompareValidator。将其ControlToValidate属性设置为日期控件。将其Type属性设置为Date。将操作符属性设置为DataTypeCheck,例如:

<asp:CompareValidator
    id="dateValidator" runat="server" 
    Type="Date"
    Operator="DataTypeCheck"
    ControlToValidate="txtDatecompleted" 
    ErrorMessage="Please enter a valid date.">
</asp:CompareValidator>

4
简洁优雅,而且内置控件还能检查有效/无效的闰年日期。2011年2月29日会显示为无效,但2012年2月29日则会显示为有效。不需要烦恼于复杂的正则表达式! - Dillie-O
1
@Ryan Sammut,我也想知道这个问题的答案。日期类型CompareValidator接受MM/DD/YY格式。我想排除2位数年份值。 - danyim
3
请注意,CompareValidator 与文化相关,因此如果您想使用其他日期格式(例如dd-mm-yyyy),请相应地设置文化。 - Richard
1
这个可以使用,但是需要注意的是,它允许超出 SQL 日期范围小于 1753 年的日期,或者你可能需要一个日期范围(没有将来的日期项)。这个方法确实可行,但在修改 SQL 日期时可能需要使用 Chris Van Opstal 的方法。 - Charles Byrne
这个无法满足所要求的问题,因为日期格式被指定为“dd MMMM yyyy”。CustomValidator 只在日期格式为“dd/mm/yyyy”(对于 en-GB)或“mm/dd/yyyy”(对于 en-US)时才能正常工作。 - Fandango68

27

这里也可以使用CustomValidator:

<asp:CustomValidator runat="server"
    ID="valDateRange" 
    ControlToValidate="txtDatecompleted"
    onservervalidate="valDateRange_ServerValidate" 
    ErrorMessage="enter valid date" />

后台代码:

protected void valDateRange_ServerValidate(object source, ServerValidateEventArgs args)
{
    DateTime minDate = DateTime.Parse("1000/12/28");
    DateTime maxDate = DateTime.Parse("9999/12/28");
    DateTime dt;

    args.IsValid = (DateTime.TryParse(args.Value, out dt) 
                    && dt <= maxDate 
                    && dt >= minDate);
}

我尝试了你的方法,但在更新面板中失败了。请查看:https://dev59.com/oUvSa4cB1Zd3GeqPdlii#14361135 - Yoosaf Abdulla
1
这对我来说是最好的方式,最简单的方式,并且我可以完全控制代码背后所检查和完成的内容。非常感谢Chris! - user1501127
1
这对于使用日期时间字段的旧系统的SQL日期范围编辑非常有效。谢谢。 - Charles Byrne

8
我认为以下是最简单的方法来做这件事。
<asp:TextBox ID="DateControl" runat="server" Visible="False"></asp:TextBox>
<asp:RangeValidator ID ="rvDate" runat ="server" ControlToValidate="DateControl" ErrorMessage="Invalid Date" Type="Date" MinimumValue="01/01/1900" MaximumValue="01/01/2100" Display="Dynamic"></asp:RangeValidator>

2
我认为日期必须在应用程序的当前文化中指定。您可能想试试将 CultureInvariantValues 设置为 true,看看是否解决了您的问题。否则,您可能需要更改当前文化的 DateTimeFormat(或culture本身)以获得您想要的结果。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接