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

时间:2015-04-16 04:21:21

标签: c# jquery asp.net asp.net-mvc-4 razor

我有登记表格及其包含出生日期字段。

使用日历日期选择器,将其输入此字段的值。

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

第1步

enter image description here

第2步

enter image description here

第3步

enter image description here

所以它以 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&gt;年龄> 18

我应采取的方法是什么?

4 个答案:

答案 0 :(得分:9)

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

在您使用的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属性,您将获得类似

的内容
  

字段&#34; {0}&#34;无效。

{0}将替换为您在模型中为该属性提供的属性名称或显示名称属性。

希望它适合你。

沃尔特 ps:确保在控制器中执行

if (ModelState.IsValid)
{
 ....
}

答案 1 :(得分:1)

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

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;
}

答案 2 :(得分:0)

为@ 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>
}

答案 3 :(得分:0)

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

<configuration>