我有这个设置:
视图模型:
public class MyViewModel
{
public DateTime? Start { get; set; }
}
查看:
@model MvcApplication2.Models.MyViewModel
@using (Html.BeginForm())
{
@Html.EditorFor(x => x.Start)
}
结果HTML:
<input class="text-box single-line" data-val="true" data-val-date="The field Start must be a date." id="Start" name="Start" type="datetime" value="" />
此HTML包含不显眼的验证属性。这是为什么?我的印象是,如果ViewModel属性是可以为空的DateTime,则不会进行验证吗?
答案 0 :(得分:4)
问题与全球化有关。由于我支持多种文化,我将包括jquery-globalize脚本并添加以下内容:
$(document).ready(function () {
$.validator.methods.date = function (value, element) {
return Globalize.parseDate(value);
}
});
Globalize.parseDate在空值上失败。这仅在可空日期字段中变得明显,其中空值应被视为有效。如果我用
替换它return value == '' ? null : Globalize.parseDate(value);
一切都按预期工作。
答案 1 :(得分:1)
因为MVC非常聪明,因为你的财产类型是DateTime,所以放在那里的任何东西必须至少是一个有效的日期。换句话说,放置的验证限制是由于您的属性是DateTime类型的事实。只有在现场输入内容时才会执行验证。
答案 2 :(得分:0)
即使这是一个旧帖子,当输入搜索词“可为空的字段的MVC日期验证”时,它也会出现在Google搜索结果的顶部。
HTML5具有出色的解决方案:
对以下字段使用@type = "date"
,@min
和@max
属性:
@Html.TextBoxFor(Model => Model.YourPropertyHere, "{0:yyyy-MM-dd}", new { id = "YourPropertyID", @class = "form-rounded", @type = "date", @min = "2019-01-01", @max = "2099-01-01" })
以及验证消息:
@Html.ValidationMessageFor(model => model.YourPropertyHere, "", new { @class = "text-danger" })
@class
属性引用Bootstrap的CSS。