使用 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 date
和 end date
,这样您就可以不用担心验证来渲染您的日期选择器
@Chathz,根据今天的日期计算控制器中允许的最小和最大日期,然后将它们传递给视图(使用视图模型或ViewBag
属性,然后设置日期选择器minDate
和 maxDate
选项 - 例如 ..., minDate: @Model.MiinDate, ...` 但这不会为您提供服务器端验证,因此您需要再次检查 POST 方法并酌情添加 ModelState.Errors
@Chathz,您还可以使用数字偏移量来指定 minDate
和 MaxDate
值,例如 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 中的模型根据出生日期验证年龄的主要内容,如果未能解决你的问题,请参考以下文章