【问题标题】:Regular expression validation time正则表达式验证时间
【发布时间】:2015-09-16 14:14:05
【问题描述】:

我想使用正则表达式进行验证时间(格式HH:MM)。我有:

[DataType(DataType.Time)]
[RegularExpression(@"^(?:0?[0-9]|1[0-9]|2[0-3]):[0-5][0-9]$", ErrorMessage = "Time format HH:MM ")]
public System.DateTime Time { get; set; }

当我在表单动态验证(客户端)的文本框中添加时间时,就可以了。当我写示例43:444 时,它被选中。当我写示例12:43 是好的(没有检测到错误)但是当我点击提交时,显示了ErrorMessage,虽然格式是好的。怎么修?

【问题讨论】:

  • 真的没有机会将该属性映射到一些使用DateTime.TryParseExact 的代码吗? Xcheck this post.

标签: regex validation time asp.net-mvc-5


【解决方案1】:

您可以像这样使用正则表达式:

^([01][0-9]|2[0-3]):[0-5][0-9]$

Working demo

【讨论】:

    【解决方案2】:

    尝试使用此自定义验证:

    [ValidateDate]
    public string Time { get; set; }
           ^^^^^^
    

    这里是ValidateDate属性的实现:

    public class ValidateDate: ValidationAttribute
    {
        protected override ValidationResult IsValid(object value, ValidationContext validationContext)
        {                 
            DateTime dateValue;
            if (DateTime.TryParseExact(value, "HH:mm", 
                System.Globalization.CultureInfo.InvariantCulture,
                    System.Globalization.DateTimeStyles.None, out dateValue))
                return ValidationResult.Success;
            else
                return new ValidationResult("Expected time format: HH:mm.");
        }
    }
    

    请注意,如果您还打算接受类似2:00 的值,则需要使用new[] {"HH:mm", "H:mm"} 而不是"HH:mm"

    【讨论】:

    • 我在条件下遇到异常:“RadioSite.dll 中发生了“System.InvalidCastException”类型的异常,但未在用户代码中处理其他信息:无法转换“System.DateTime”类型的对象' 输入 'System.String'。"
    • 我认为您可以通过添加DateTime dt_value = (DateTime)value; 并将(string)value 替换为string.Format("{0}:{1}", dt_value.Hour, dt_value.Minute) 来修复它。
    • 这项工作可能还可以。谢谢!。但是我还有一个问题:当我输入示例时:21:22:22 (with seconds) 这个验证是成功的。以秒为单位的时间怎么会不正确?
    • 那你需要将属性类型改为字符串,否则看起来没有意义。我更新了答案。我什至认为您现在可以使用 acregex,但我仍然认为应该在没有 regex 的情况下完成日期和时间验证。使用适当的方法和类更容易维护和扩展。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-10-27
    • 2012-01-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多