使用DataAnnotations对DateTime / Date进行MVC2客户端/服务器验证

时间:2010-06-10 00:46:46

标签: c# asp.net-mvc asp.net-mvc-2

以下是真实的:

  • 我的一个列(BirthDate)的类型为SQL Server中的Date。
  • 当EF生成模型时,同一列(BirthDate)的类型为DateTime。
  • 我在客户端使用JQuery UI Datepicker来选择BirthDate。

我的好友课程中有以下验证逻辑:

[Required(ErrorMessageResourceType = typeof(Project.Web.ValidationMessages), ErrorMessageResourceName = "Required")]
[RegularExpression(@"\b(0?[1-9]|1[012])[/](0?[1-9]|[12][0-9]|3[01])[/](19|20)?[0-9]{2}\b", ErrorMessageResourceType = typeof(Project.Web.ValidationMessages), ErrorMessageResourceName = "Invalid")]
public virtual DateTime? BirthDate
{
    get;
    set;
}

这有两个问题:

  1. 这不会通过服务器端验证(如果我启用客户端验证,它可以正常工作)。我假设这是因为正则表达式没有考虑小时,分钟,秒,因为在验证发生时,文本框中的值已经被转换为服务器上的DateTime。

  2. 如果数据已存在于数据库中并被读入模型并显示在页面上,则BirthDate字段会在我的文本框中显示小时,分钟,秒(我不想要)。我总是可以使用ToShortDateString(),但我想知道是否有一些我可能会缺少的更清洁的方法。

  3. 由于

1 个答案:

答案 0 :(得分:1)

1:通过将DateTime更改为不可为空可以轻松解决此问题,这意味着输入的日期时间值必须是可解析的,因此有效,然后使用:

[DataType(DataType.Date)]

属性而不是正则表达式。这将确保该字段是必需的,并且必须是可解析的。

2:这是一个模板问题。简单的方法是在/ Views / Shared / EditorTemplates中创建一个自定义的Date.ascx模板,该模板调用ToShortDateString()并挂钩你的jquery datepicker。

这就是我的样子:

<%@ Import Namespace="System.Web.Mvc.Html" %>
<%
string displayText = string.Empty;

if (Model != null)
{
    if (DateTime.Parse(Model.ToString()) != DateTime.MinValue)
        displayText = DateTime.Parse(Model.ToString()).ToShortDateString();
}
%>

<%= Html.TextBox("", displayText, new { @class = "date-box" })%>
相关问题