我有一个Kendo MaskedTextBox,如下所示。
@(Html.Kendo().MaskedTextBox()
.Name("kendoMaskedTextBox1")
.Rules(rules =>
{
rules.Add('0', "/[0]{1}[1]{1}/");
})
.Mask("00/00/0000")
)
我的问题是如何添加规则,使其格式为:MM/DD/YYYY,但同时不允许00。基本上,对于MM/DD部分,我希望它查看MM是否第一个值为0,如果是,则下一个值只能为1-9;对于DD,如果第一个值为0,则下一个值只能为1-9,等等,但对于YYYY,我希望允许000而不是0000。
有人能帮我开始这个,也许只是MM部分,所以我可以尝试其他自己?
这是我需要的更明确的术语:
MM只能是下列任意一个的值:01、02、03、04、05、06、07、08、09、10、11、12
逐条分解。从最简单的限制开始,月份:
0[1-9]|1[0-2]
然后开始新的一天:
0[1-9]|[12][0-9]|3[01]
然后是年份:
(?!.*0000$)d{4}
最后将它们组合成一个RegEx:
^(?:0[1-9]|1[0-2])(?:0[1-9]|[12][0-9]|3[01])(?:(?!.*0000$)d{4})$
请注意,仍然可以输入无效的日期,例如02/31/2002,真正验证日期的唯一方法是通过编程从输入字符串创建一个date对象,并测试它是否正确解析。
我很确定在MaskedTextBox中,规则中的RegEx必须是单个字符的允许集。在你的例子中,你试图让掩码中的"0"代表两个字符/0[1-9]|1[0-2]/,这是不能做到的。您可以为每个数字制定单独的规则,但这仍然允许00和19表示月份。
我试着为两个字符的代码"JJ"设置一个规则,但这也不起作用。我还尝试在相同的输入上同时使用MaskedTextBox和DatePicker,结果不太理想。
你可以做一组keyup检查,确保碎片是正确的,并进行"更正"。但我发现这种UI很令人沮丧,而且要确保捕捉或允许所有可能的排列可能需要大量的工作。
我认为tenub有它的权利,你最好的选择使用任何一个控件将使用一组验证(无论是在模糊或之前消费的值),以确保在字段中的数据是一个适当的日期。