【问题标题】:Unobtrusive validation attributes rendered for nullable DateTime为可为空的 DateTime 呈现不显眼的验证属性
【发布时间】:2013-09-25 13:21:42
【问题描述】:

我有这个设置:

视图模型:

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

【问题讨论】:

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


    【解决方案1】:

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

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

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

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

    一切都按预期进行。

    【讨论】:

      【解决方案2】:

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

      【讨论】:

      • 问题在于,当控制器中的 ModelState.IsValid = true 时,客户端不显眼的验证会拾取属性并在该字段留空时显示客户端错误。
      • 这不太可能。我在许多项目中都有相同的场景,并且我一直使用可为空的 DateTime 字段。我从来没有遇到过这样的问题。您是否可能在项目中使用某种自定义模型绑定器?您的属性是否使用Required 属性装饰?
      • 如果我每次设置一个测试项目来演示这个问题都会得到一个镍币,这会导致我遇到根本问题......你当然是正确的,请参阅我的答案以获得解释。
      【解决方案3】:

      即使这是一篇旧帖子,当输入搜索词“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。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2014-04-04
        • 1970-01-01
        • 1970-01-01
        • 2020-03-05
        • 2018-07-12
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多