Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/jsp/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Asp.net mvc 为可为Null的DateTime呈现的不引人注目的验证属性_Asp.net Mvc_Validation_Asp.net Mvc 4_Razor - Fatal编程技术网

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字段。我从来没有遇到过这样的问题。您是否正在项目中使用某种自定义模型绑定器?您的财产是否装饰有必需的属性?如果每次设置测试项目来演示问题时我都有一枚镍币,那么我就找到了根本问题。。。你当然是对的,请看我的答案。