使用正则表达式的ASP.NET MVC2奇怪验证问题(DataAnnotations)

时间:2010-06-26 18:20:27

标签: asp.net-mvc regex validation jquery-ui data-annotations

我通过服务层连接了验证,我的Birthdate属性看起来像这样。

    <DisplayName("birthdate")> _
    <RegularExpression("^\d{2}\/\d{2}\/\d{4}$", ErrorMessage:="Birthdate is not in the correct format.")> _
    <DisplayFormat(ApplyFormatInEditMode:=True, ConvertEmptyStringToNull:=True, DataFormatString:="{0:MM/dd/yyyy}")> _
    Public Property BirthDate As DateTime

如果我输入类似12/12/1990的内容,客户端验证可以正常工作,但是当提交表单时,服务器端验证会跳闸,并且我被告知条目无效。我正在使用jQuery-UI Datepicker输入日期,但是当我禁用datepicker时,问题仍然存在。

我在这里遗漏了什么吗?我认为客户端和服务器端都是一样的。

<击>有感。

<击>

可能是因为我在SQL Server数据库中使用datetime2(0)吗?

  

我测试了上述理论无济于事......同样的问题。

编辑:

如果我删除

<RegularExpression("^\d{2}\/\d{2}\/\d{4}$", ErrorMessage:="Birthdate is not in the correct format.")>

然后表单提交。这显然与正则表达式有关。

编辑:

以下代码也不起作用,但我想知道是否有办法修改modelState以在传递给IsValid方法之前正确设置日期?

    Dim birthdate As String = user.BirthDate
    ModelState.Item("BirthDate") = DateTime.Parse(birthdate)

1 个答案:

答案 0 :(得分:2)

假设用户在文本字段中输入06/27/2010并提交表单。

  1. 默认模型绑定器运行并尝试绑定用户输入的模型。 BirthDate属性的类型为DateTime,您知道此类型包含小时部分。现在BirthDate = 6/27/2010 12:00:00 AM

  2. 验证将在下一步开始。 BirthDate属性使用RegularExpression属性进行修饰,因此调用IsValid方法时,字符串值6/27/2010 12:00:00 AM会因您的模式而失败。

  3. 向用户显示相应的错误消息。

  4. 因此,使用这个正则表达式属性是有问题的。 RegularExpressionAttribute可以正常使用字符串属性。

    如果用户输入无效日期,模型绑定器将在验证发生之前进行抗议。它还会检查您的正则表达式没有的无效日期和月份。