4

我有这个设置:

视图模型:

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

4

3 回答 3

5

这个问题与全球化有关。由于我支持多种文化,因此我包含了 jquery-globalize 脚本并添加了以下内容:

$(document).ready(function () {
    $.validator.methods.date = function (value, element) {
        return Globalize.parseDate(value);
    }
});

Globalize.parseDate 在空值上失败。这仅在可空日期字段上变得明显,其中空值应被视为有效。如果我将其替换为

return value == '' ? null : Globalize.parseDate(value);

一切都按预期工作。

于 2013-09-25T19:46:11.827 回答
1

因为 MVC 足够聪明,可以确定由于您的属性类型是 DateTime ,因此放置在那里的任何内容至少必须是有效日期。换句话说,设置的验证限制是由于您的属性是 DateTime 类型。只有在字段中输入内容时才会执行验证。

于 2013-09-25T13:25:18.627 回答
0

即使这是一篇旧帖子,当输入搜索词“MVC Date Validation for nullable field”时,它也会出现在 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。

于 2019-05-17T18:35:39.880 回答