Asp.net mvc 为可为Null的DateTime呈现的不引人注目的验证属性
我有以下设置: 视图模型:Asp.net mvc 为可为Null的DateTime呈现的不引人注目的验证属性,asp.net-mvc,validation,asp.net-mvc-4,razor,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" dat
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,则不会进行验证?因为MVC非常聪明,能够发现既然属性的类型是DateTime,那么放置在其中的任何内容都必须至少是有效日期。换句话说,设置的验证限制是由于您的属性类型为DateTime。只有在字段中输入了某些内容时,才会执行验证。问题与全球化有关。因为我支持多种文化,所以我包括jquery globalize脚本,并添加了以下内容:
$(document).ready(function () {
$.validator.methods.date = function (value, element) {
return Globalize.parseDate(value);
}
});
Globalize.parseDate在空值上失败。这仅在可为空的日期字段上变得明显,其中空值应被视为有效。如果我用
return value == '' ? null : Globalize.parseDate(value);
一切正常。尽管这是一篇旧文章,但当输入搜索词“可为空字段的MVC日期验证”时,它会出现在谷歌搜索结果的顶部附近 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。问题在于,当控制器中的ModelState.IsValid=true时,客户端非干扰性验证会拾取属性,并在字段留空时显示客户端错误。这是不太可能的。在我的许多项目中都有相同的场景,我一直使用可为空的DateTime字段。我从来没有遇到过这样的问题。您是否正在项目中使用某种自定义模型绑定器?您的财产是否装饰有必需的属性?如果每次设置测试项目来演示问题时我都有一枚镍币,那么我就找到了根本问题。。。你当然是对的,请看我的答案。