65.9K
CodeProject 正在变化。 阅读更多。
Home

ASP.NET MVC 中日期格式和其他表单属性的自定义日期验证

starIconstarIconstarIconstarIconstarIcon

5.00/5 (2投票s)

2017年6月15日

CPOL

5分钟阅读

viewsIcon

54789

downloadIcon

388

本文将介绍如何在 ASP.NET MVC 中通过编写自定义验证器来实现 dd/mm/yyyy 格式的日期验证,并将其值与其他表单属性进行比较。

ASP.NET MVC 中的自定义验证器,用于检查日期格式 (dd/mm/yyyy) 并将其值与表单中的其他属性进行比较

本文将帮助您理解如何在 ASP.NET MVC 中编写自定义验证器,以及如何在自定义验证代码中将表单中某个字段的值与另一个字段进行比较。这些验证发生在服务器端,因此无论任何客户端验证,应用程序都应具有服务器端验证。经验法则是,所有用户输入都是“坏”的,除非经过验证。因此,请在客户端、应用程序服务器级别以及数据库服务器(SQL Server / Oracle 存储过程)进行验证。

背景

您应该对 MVC 应用程序的工作方式有基本了解,尽管我已包含有关如何创建第一个 MVC 应用程序的步骤,但本文是为那些熟悉 MVC 的用户准备的。此代码是在 VS 2010 .NET framework 4.0 中编写和测试的,但逻辑在大版本中或多或少应该保持不变。

使用代码

首先,我们开始创建我们的 MVC 应用程序

1. 打开 Visual Studio。转到 文件 -> 新建项目 -> 其他语言 -> Web -> C# 选择 ASP.NET MVC 4 应用程序

 

2. 点击“确定”后,您将看到另一个窗口。选择“基本”并点击“确定”

3. 现在您的 MVC 应用程序已创建。现在我们将创建我们的 Model 类。这个类将与我们希望从用户那里获得的 HTML 表单中的内容相似。右键单击 Models 文件夹,然后转到 添加 -> 类。创建一个新类 Employee.cs。

Employee 类的结构应如下所示

//
  public class Employee
    {
        public int EmployeeId { get; set; }
        public string EmployeeName { get; set; }
        public string Department { get; set; }
        public int PhoneNumber { get; set; }
        public string DateOfBirth { get; set; }
        public string JoiningDate { get; set; }
    }
//

我们将在本教程后面获取用户对该类所有上述属性的输入。此时请编译您的项目,否则第 3 步将不起作用。

3. 现在我们将添加我们的 View 并将其映射到这个 Employee 类。右键单击 Views 文件夹,然后转到 添加 -> 新建文件夹。在 Views 文件夹下创建一个名为 Home 的文件夹。现在右键单击 Home 文件夹,然后转到 添加 -> View

将视图命名为 index,并按照下图所示进行设置。请记住点击“创建强类型视图”,并从下拉列表中选择 Employee 类。如果您在下拉列表中看不到任何内容,请构建您的项目。

4. 现在打开您的视图并进行如下更改

//
@model MvcApplicationDataValidation.Models.Employee

@{
    ViewBag.Title = "index";
    Layout = "~/Views/Shared/_Layout.cshtml";
}

@{ using (Html.BeginForm("Index", "Home", FormMethod.Post, new { enctype = "multipart/form-data" }))
 {
       @Html.ValidationSummary(true)
    <table>
    <tr><td>Employee Id</td><td>@Html.TextBoxFor(m => m.EmployeeId)</td><td>@Html.ValidationMessageFor(m => m.EmployeeId)</td></tr>
    <tr><td>Employee Name</td><td>@Html.TextBoxFor(m => m.EmployeeName)</td><td>@Html.ValidationMessageFor(m => m.EmployeeName)</td></tr>
    <tr><td>Department</td><td>@Html.TextBoxFor(m => m.Department)</td><td>@Html.ValidationMessageFor(m => m.Department)</td></tr>
    <tr><td>Phone Number</td><td>@Html.TextBoxFor(m => m.PhoneNumber)</td><td>@Html.ValidationMessageFor(m => m.PhoneNumber)</td></tr>
    <tr><td>Date Of Birth (dd/mm/yyyy)</td><td>@Html.TextBoxFor(m => m.DateOfBirth)</td><td>@Html.ValidationMessageFor(m => m.DateOfBirth)</td></tr>
    <tr><td>Joining Date (dd/mm/yyyy)</td><td>@Html.TextBoxFor(m => m.JoiningDate)</td><td>@Html.ValidationMessageFor(m => m.JoiningDate)</td></tr>
    <tr><td></td><td><input type="submit" value="Submit"/></td></tr>
    </table>
 }
}
//

此视图的 HTML 如下

请注意,视图中的所有字段都映射到了 Model 的属性。

现在我们的 MVC 应用程序的基本结构已经完成。我们将为该表单的输入字段添加验证。

MVC 中有一个内置功能,其中一些字段有一些预定义的验证。

验证被添加为 Model 类 (Employee) 属性上的一个属性,代码如下所示

//
        [Required]
        [StringLength(50, MinimumLength = 3)]
        public string Department { get; set; }
//

这里的 Required 属性将使该字段成为必填项,StringLength 属性将使 Department 的最大值为 50,最小长度为 3。如果您点击提交按钮,当您将 Department 文本框留空,或者最小长度小于 3,或者最大值大于 50 时,您应该会看到错误消息。参见截图

到目前为止,我们已经实现了内置的 MVC 验证属性。现在我们将创建自己的自定义验证。

我们将验证“出生日期”和“入职日期”的日期格式。我们期望的格式是 dd/mm/yyyy。我们还将验证入职日期应大于出生日期,并且出生日期应小于当前日期。在这里,您将获得如何编写自定义验证器的想法。一旦您理解了如何编写自定义验证器,您就可以通过编写自定义验证器在 MVC 中执行任何类型的验证。

5. 在项目中添加一个新的文件夹 Validators。我们将把自定义验证类放在这个文件夹中。

6. 在这个文件夹中添加一个新的类,并将其命名为 DateValidatorAttribute,然后添加以下代码

//
public class DateValidatorAttribute : ValidationAttribute
    {
        protected override ValidationResult IsValid(object value, ValidationContext validationContext)
        {
            try
            {
                string strValue = value.ToString();
                var dateTime = DateTime.Parse(strValue);
                string pattern = @"(^(((0[1-9]|1[0-9]|2[0-8])[\/](0[1-9]|1[012]))|((29|30|31)[\/](0[13578]|1[02]))|((29|30)[\/](0[4,6,9]|11)))[\/](19|[2-9][0-9])\d\d$)|(^29[\/]02[\/](19|[2-9][0-9])(00|04|08|12|16|20|24|28|32|36|40|44|48|52|56|60|64|68|72|76|80|84|88|92|96)$)";
                Match match = Regex.Match(strValue, pattern);
                if (match.Success)
                {
                    var property = validationContext.ObjectType.GetProperty("JoiningDate");
                    if(property == null)
                        return new ValidationResult(string.Format("Property '{0}' is Null", "JoiningDate"));
                    var objJoiningDate = property.GetValue(validationContext.ObjectInstance,null);
                    string strJoiningDate = objJoiningDate == null ? "" : objJoiningDate.ToString();
                    Match matchJoiningDate = Regex.Match(strJoiningDate, pattern);
                    if (matchJoiningDate.Success)
                    {
                        var joiningDate = DateTime.Parse(strJoiningDate);
                        if(dateTime > joiningDate)
                            return new ValidationResult("Date of Birth can not be greater than Joining date");
                        if (dateTime > DateTime.Now)
                            return new ValidationResult("Date of Birth can not be greater todays date");
                    }
                }
                else
                  return new ValidationResult("Invalid date format");
                return ValidationResult.Success;
            }
            catch (Exception)
            {
                return new ValidationResult("Invalid date format");
            }
        }
    }
//

我们应该继承 .NET ValidationAttribute 类,以便我们可以编写自定义验证逻辑。现在我们将重写 ValidationAttribute 类的 IsValid 方法。

value 对象包含 HTML 字段的文本。这个 HTML 字段的值已经映射到了 Employee 类的属性。

这里我们首先将值转换为字符串,然后将其解析为 DateTime.parse 函数,以检查值是否有效,而不考虑格式。现在我们使用正则表达式来验证字符串的格式是否为 dd/mm/yyyy。您可以修改正则表达式以包含其他格式。

到目前为止,我们已经验证了日期是有效的并且格式正确。接下来,我们将验证该值不大于入职日期,并且也不大于当前日期。

var property = validationContext.ObjectType.GetProperty("JoiningDate");

上面的代码获取 Employee 类属性 JoiningDate 的属性。现在我们将获取该属性的值(这是用户在 View 的 Joining Date 文本框中输入的)。

var objJoiningDate = property.GetValue(validationContext.ObjectInstance,null);

现在我们有了值的对象,我们将将其转换为字符串并再次进行 Regex 匹配模式。我们将检查入职日期是否也是正确的 dd/mm/yyyy 格式。一旦所有验证都通过,我们将它们转换为 DateTime 格式并进行验证。

var joiningDate = DateTime.Parse(strJoiningDate); if(dateTime > joiningDate) return new ValidationResult("Date of Birth can not be greater than Joining date"); if (dateTime > DateTime.Now) return new ValidationResult("Date of Birth can not be greater todays date");

这只是一个关于如何在自定义验证中获取 HTML 表单其他字段值的示例。通过这种方式,您可以编写自己的代码来执行所有类型的验证。此外,如果您的应用程序是从日历控件而不是用户那里获取输入,本文可能有助于您验证日期时间格式。

历史

这是第一个版本

© . All rights reserved.