为可为空的DateTime呈现的不显眼的验证属性

时间:2013-09-25 13:21:42

标签: asp.net-mvc validation asp.net-mvc-4 razor

我有这个设置:

视图模型:

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,则不会进行验证吗?

3 个答案:

答案 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。