【问题标题】:MVC how to validate DateTime field with also client validationMVC 如何通过客户端验证来验证 DateTime 字段
【发布时间】:2013-01-23 08:51:34
【问题描述】:

在我的视图模型中,我设置了一个具有此属性的字段。

如果用户以正确的格式输入日期和时间,一切正常。

如果用户没有以正确的格式插入日期时间,则会出现错误。

我也想在客户端进行验证。

你能告诉我怎么做吗?

   [Required]
    [Display(Name = "Start DateTime")]
    [DisplayFormat(ApplyFormatInEditMode = true, DataFormatString = "{0:MM/dd/yyyy HH:mm}")]
    public System.DateTime DateTimeStart { get; set; }

【问题讨论】:

  • 那么,当您提交无效值时,它只检查服务器上的 DateTime 而不首先在客户端执行?

标签: asp.net-mvc asp.net-mvc-3 model-view-controller


【解决方案1】:

DateTime 类型的属性中获取格式异常是非常烦人的问题。在DateTime 上进行验证时,这是一个相当常见的问题。

DataAnnotaions 在服务器端工作,要充分利用它们,您需要在控制器中添加 ModelState.IsValid()

public ActionResult Index(MyViewModel model)
{
    if(ModelState.IsValid())
    {
       // valid data received...
    }
    else
    {
       // Invalid data, add model error here and return view...
    }
}

如果您要在客户端上进行这些工作,那么您需要在代码中包含两个额外的JavaScript 文件,即jquery.validate.jsjquery.validate.unobtrusive.js 以及jQuery 核心库。默认情况下,所有这些文件都来自基本 MVC 项目并包含在 Layout 中。

请务必注意包含这些文件的顺序。 jQuery 核心应始终位于顶部,然后是验证库。

  • jquery.js
  • jquery.validate.js
  • jquery.validate.unobtrusive.js

确保在web.config 文件中打开验证标志 MVC 项目。转到此文件并找到以下内容并设置它们 true 如果它们是假的。

<appSettings>
  <add key="ClientValidationEnabled" value="true"/> 
  <add key="UnobtrusiveJavaScriptEnabled" value="true"/> 
</appSettings>

这应该将您的验证设置为在客户端工作。您可以使用RegularExpression 来装饰模型属性。

 [Required]
 [RegularExpression("^(([0-2]?[0-9]|3[0-1])/([0]?[1-9]|1[0-2])/[1-2]\d{3}) (20|21|22|23|[0-1]?\d{1}):([0-5]?\d{1})$", ErrorMessage = "Invalid date")]
 public string DateTimeStart { get; set; }

这将验证datetime 格式为dd-mm-yyyy hh:mm

除了在这种情况下,您还可以将您的属性设为 string 类型,因为正则表达式会处理您的日期格式。

除此之外,您还可以create your custom DataAnnotation.

【讨论】:

  • "02/31/2013 00:00" 您打算如何处理这个问题?您的正则表达式会将此日期标记为有效,而此日期无效。
  • 我从来没有使用过这种格式,只有日期,所以没有侥幸猜测。
  • 如果是这样,jquery datepicker 将是一个不错的选择:)
  • 感谢 Razor 正则表达式的解决方案似乎适合我的情况,不幸的是我无法正确修改您的正则表达式。如果输入的值采用这种格式,则验证应该通过 01/23/2013 10:25
  • [RegularExpression("^(0[1-9]|1[012])[- /.](0[1-9]|[12][0-9]|3[01])[- /.](19|20)[0-9][0-9]$", ErrorMessage = "Invalid date")] 应该有帮助
【解决方案2】:

首先,您使用什么来允许用户输入日期?

如果您使用的是Jquery DatePicker,请参阅this example,用户无法以错误的格式输入日期(除了检查元素和更改文本框值,可以忽略。)

使用 Jquery Datepicker 的示例代码:

<!doctype html>

<html lang="en">
<head>
  <meta charset="utf-8" />
  <title>jQuery UI Datepicker - Default functionality</title>
  <link rel="stylesheet" href="http://code.jquery.com/ui/1.10.0/themes/base/jquery-ui.css" />
  <script src="http://code.jquery.com/jquery-1.8.3.js"></script>
  <script src="http://code.jquery.com/ui/1.10.0/jquery-ui.js"></script>
  <link rel="stylesheet" href="/resources/demos/style.css" />
  <script>
  $(function() {
    $( "#datepicker" ).datepicker();
  });
  </script>
</head>
<body>

<p>Date: <input type="text" id="datepicker" /></p>


</body>
</html>

如果你没有使用 DatePicker,我强烈建议你使用它。

如果您是 datepicker 的新手,您可以阅读以下列出的文章以开始使用:

【讨论】:

  • 用户可以在简单的文本字段中输入日期,目前不需要使用日期选择器。谢谢你的回答。
  • DataPicker 的这个例子不包括 HH 和 MM 的选择...无论如何感谢发帖
  • 如果您不使用日期选择器,则必须进行大量验证,例如:不同月份的 30/31 天,或者今年是闰年,二月有 29 天。 ..等等。
  • 使用日期选择器不会阻止您输入无效的日期。它将强制您以##/##/#### 的格式输入数字,但您可以在此处输入任何数字。例如:44/44/4444。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-07-29
  • 2011-11-06
  • 2017-04-07
  • 2015-09-05
相关资源
最近更新 更多