【问题标题】:ASP.NET MVC date validation using data annotations & regex使用数据注释和正则表达式的 ASP.NET MVC 日期验证
【发布时间】:2015-11-16 05:32:24
【问题描述】:

我之前在尝试使用 datepicker 验证 asp.net mvc 4.5.1 中的日期时问过这个问题。现在,我已经消除了 datepicker,只是尝试使用模型中的数据注释和正则表达式来验证日期为 mm/dd/yyyy 格式以强制格式。这是我的代码:

Model:
        [DisplayName("Start Date")]
        [DataType(DataType.Date, ErrorMessage = "Date not valid.")]
        [DisplayFormat(DataFormatString = "{0:MM/dd/yyyy}", ApplyFormatInEditMode = true)]
        [RegularExpression(@"^(\d{1,2})(\/|-)(\d{1,2})(\/|-)(\d{4})$", ErrorMessage = "Date must be in format mm/dd/yyyy")]
        public DateTime? DT_Project_Start { get; set; }

查看:

<div class="form-group">
       @Html.LabelFor(model => model.DT_Project_Start, new { @class = "control-label col-md-2 CreateEditFieldNamesSpan" })
<div class="col-md-10">
       @Html.TextBoxFor(model => model.DT_Project_Start)
       @Html.ValidationMessageFor(model => model.DT_Project_Start)
                            </div>
                        </div>

不起作用...在表单中验证可以完美运行,但是当我单击“提交”时,它会显示无效日期,不管怎样,即使日期有效且格式正确。有谁知道我错过了什么?

【问题讨论】:

  • 因为您的财产是DateTime。删除正则表达式(毫无意义)。您需要修改$.validator 方法或使用jquery.globalize.js 如果您使用jquery-ui datepicker,请参考this answer
  • 感谢您的回复。如果我删除正则表达式,如何强制客户输入 4 位数年份?在这一点上,我根本没有使用 datepicker。它不适用于 IE。
  • 首先,如果你使用@TextBoxFor()[DataType][DisplayFormat] 有点毫无意义。其次,您应该考虑询问有关日期选择器和 IE 的问题,因为它没有理由不工作。
  • 另外,如果你想要MM/dd/yyyy,为什么要允许- 作为日期分隔符?
  • 我真的是 asp.net 的新手,只是学习一切。我花了很多时间试图得到这个。有人给了我正则表达式,我没有删除代码中的 - ,但我会这样做!我确实有一个关于 datepicker 的线程,并且我得到了它的工作(除了在 IE 中),但我仍然必须允许手动输入,所以仍然需要强制 4 位数的年份,无论哪种方式。如果@TextBoxFor() 不能与 [DataType] 和 [DisplayFormat] 一起使用,我应该使用什么?

标签: jquery asp.net regex asp.net-mvc validation


【解决方案1】:

如果你想强制用户输入一个 4 位数的日期,你可以使用下面的RegularExpressionAttribute 到你的属性

[RegularExpression(@".*\d{4}.*", ErrorMessage = "Please enter a 4 digit year")]
public DateTime? DT_Project_Start { get; set; }

请注意,DateTime 属性包含时间组件,这就是您当前的正则表达式可能失败的原因。另请注意,您不需要[DataType][DisplayFormat] 属性。只有当您使用 EditorFor()DisplayFor() 方法时,才会尊重这些。由于您使用TextBoxFor(),您可以使用格式化日期

@Html.TextBoxFor(m => m.DT_Project_Start, "{0:MM/dd/yyyy}")

从显示中去除时间分量。

【讨论】:

  • 到目前为止,这运行得非常好。非常感谢您提供的时间和回复。我的投票似乎还没有计算在内,但是一旦我获得足够高的声望,我就会回来投票!你帮了大忙!
  • 你认为我可以在不验证的情况下添加一个通用的日期选择器函数以方便输入日期吗?
  • 抱歉,不知道您上次评论的意思。
  • 我们最终希望在这些日期字段上使用下拉日历,因为它使输入更容易,但他们仍然需要能够输入日期,因为日期可能在未来是 waaaaaay,所以我仍然需要验证。仍然需要 4 位数的年份验证,以便输入正确的千年。
  • 正则表达式属性仍可与日期选择器控件一起使用 - 例如 jquery-ui datepicker
猜你喜欢
  • 2015-08-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-04-22
  • 2011-12-31
  • 1970-01-01
相关资源
最近更新 更多