使用 mvc 4 中的模型根据出生日期验证年龄

Posted

技术标签:

【中文标题】使用 mvc 4 中的模型根据出生日期验证年龄【英文标题】:validate age according to date of birth using model in mvc 4 【发布时间】:2015-06-22 07:16:27 【问题描述】:

我有注册表,其中包含出生日期字段。

使用日历日期选择器将值输入到该字段。

这些是为该字段插入值的步骤

第一步

第二步

第三步

所以它以 dd/MM/yyyy 格式取值

这是我的模型类

出生日期字段的外观
[DisplayName("Date of Birth")]
[DataType(DataType.Date), DisplayFormat(DataFormatString = "0:dd/MM/yyyy", ApplyFormatInEditMode = true)]
public Nullable<System.DateTime> Date_of_Birth  get; set; 

这是我的查看文件

出生日期字段的外观
   <div class="form-group"> 
   <div class="editor-label">
        @html.LabelFor(model => model.Date_of_Birth)
        @Html.Label("*", new  id="star" , @class = "requiredFiledCol" )
   </div>
   <div class="editor-field">
        @Html.TextBoxFor(model => model.Date_of_Birth, "0:dd/MM/yyyy", new  @class = "form-control datepicker", placeholder = "DD/MM/YYYY" , maxlength="100" )
        @Html.ValidationMessageFor(model => model.Date_of_Birth)
    </div>
    </div>

我想对出生字段的数据进行客户端验证。当输入字段不在此范围内时显示错误消息100>Age>18

我应该采取什么方法?

【问题讨论】:

没有什么可以做到这一点。您需要编写自己的验证属性并实现IClientValidatable。 This article 提供了很好的指导。 旁注:您没有使用EditorFor() 来生成HTML5 日期选择器,因此不需要[DataType(DataType.Date)]ApplyFormatInEditMode = true(它们仅适用于EditorFor() 我希望你通过javascript初始化datepicker。然后,您将有几个选项来设置 start dateend date,这样您就可以不用担心验证来渲染您的日期选择器 @Chathz,根据今天的日期计算控制器中允许的最小和最大日期,然后将它们传递给视图(使用视图模型或ViewBag 属性,然后设置日期选择器minDatemaxDate 选项 - 例如 ..., minDate: @Model.MiinDate, ...` 但这不会为您提供服务器端验证,因此您需要再次检查 POST 方法并酌情添加 ModelState.Errors @Chathz,您还可以使用数字偏移量来指定 minDateMaxDate 值,例如 minDate: -20, maxDate: "+1M +10D" 。 `Refer documentation 【参考方案1】:

既然您已经在使用数据注释,为什么不自己制作。 这样做:

在您使用的 dll 中创建一个类或创建一个新类,并至少向其中添加以下代码

public class MinimumAgeAttribute: ValidationAttribute

    int _minimumAge;

    public MinimumAgeAttribute(int minimumAge)
    
      _minimumAge = minimumAge;
    

    public override bool IsValid(object value)
    
        DateTime date;
        if (DateTime.TryParse(value.ToString(),out date))
        
            return date.AddYears(_minimumAge) < DateTime.Now;
        

        return false;
    

然后在您的视图模型中执行以下操作:

[MinimumAge(18)]
[DisplayName("Date of Birth")]
[DataType(DataType.Date), DisplayFormat(DataFormatString = "0:dd/MM/yyyy", ApplyFormatInEditMode = true)]
public Nullable<System.DateTime> Date_of_Birth  get; set; 

或者您的网页不会有任何问题,因为您使用的框架会选择它。在不更改类中的 ErrorMessage 属性的情况下,您将获得类似

“0”字段无效。

0 被您在模型中提供的属性名称或显示名称属性替换。

希望它对你有用。

沃尔特 ps:确保在你做的控制器中

if (ModelState.IsValid)

 ....

【讨论】:

这看起来像答案,你知道如何用它添加自定义错误消息吗? 嗯,是的,只需以与从 ValidationAttribute 继承的 MinimumAgeAttribute 相同的数据注释方式添加它,您只需使用 .net 方式通过资源或硬编码字符串值添加它【参考方案2】:

我已经改进了 Walter 关于进行自定义验证的回答。我添加了更好的错误消息支持。这将允许更好的默认错误消息,还允许您输入具有更好的 string.Format 支持的自己的错误消息。我还更新了命名方案。例如,您应该在开头添加日期,以便您和其他开发人员知道此验证只能与 DateTime 变量一起使用,类似于为字符串命名基本 StringLengthAttribute 的方式。

public class DateMinimumAgeAttribute : ValidationAttribute

    public DateMinimumAgeAttribute(int minimumAge)
    
        MinimumAge = minimumAge;
        ErrorMessage = "0 must be someone at least 1 years of age";
    

    public override bool IsValid(object value)
    
        DateTime date;
        if ((value != null && DateTime.TryParse(value.ToString(), out date)))
        
            return date.AddYears(MinimumAge) < DateTime.Now;
        

        return false;
    

    public override string FormatErrorMessage(string name)
    
        return string.Format(ErrorMessageString, name, MinimumAge);
    

    public int MinimumAge  get; 



[DateMinimumAge(18, ErrorMessage="0 must be someone at least 1 years of age")]
[DisplayName("Date of Birth")]
[DataType(DataType.Date), DisplayFormat(DataFormatString = "0:dd/MM/yyyy", ApplyFormatInEditMode = true)]
public Nullable<System.DateTime> Date_of_Birth  get; set; 

【讨论】:

这似乎有效,但它不允许 NULL[Date_of_Birth] 即使模型显示为 Nullable。它在控制器的 ModelState.IsValid 部分返回 false。有没有办法让 NULL 作为 true 传递给 ModelState.IsValid?【参考方案3】:

一条评论询问 TroySteven 是否有办法允许 null

public override bool IsValid(object value)

    DateTime date;
    if (value == null)  //you can just add this condition
    
        return true;
    
    if ((value != null && DateTime.TryParse(value, out date)))
    
        return date.AddYears(MinimumAge) < DateTime.Now;
    

    return false;

【讨论】:

【参考方案4】:

为@Html.ValidationMessageFor 和@Html.TextBoxFor 创建一个id,然后使用javascript 来验证它。在您看来,请执行以下操作:

@section scripts
    <script>
      $(function () 
         if (document.getElementById("yourTextBoxID").value < 18)
             document.getElementById("yourValidationMessageID").value = "Can't be less than 18 years old :("
            
       );
    </script>

【讨论】:

以上是关于使用 mvc 4 中的模型根据出生日期验证年龄的主要内容,如果未能解决你的问题,请参考以下文章

Java 根据出生日期获得年龄

SQL语句如何根据出生日期计算年龄

Java 根据出生日期获得年龄

出生日期,根据出生日期怎么算年龄?

根据出生年份计算年龄的公式,如何根据出生日期求年龄?

出生年月日提取年龄公式是啥?