该字段必须是日期 - Chrome 中的 DatePicker 验证失败 - mvc

Posted

技术标签:

【中文标题】该字段必须是日期 - Chrome 中的 DatePicker 验证失败 - mvc【英文标题】:The field must be a date - DatePicker validation fails in Chrome - mvc 【发布时间】:2013-04-23 10:59:31 【问题描述】:

我有一个奇怪的问题。我的日期验证在 Chrome 中不起作用。我试过this 的回答,但它对我不起作用。

我的模型中有这个:

[Display(Name = "Date")]
[DataType(DataType.Date)]
public DateTime Date  get; set; 

我的观点:

<div class="editor-field">
@html.TextBoxFor(model => model.Item.Date, new  @class = "picker" )
@Html.ValidationMessageFor(model => model.Item.Date)
</div>

$(document).ready(function () 
    $('.picker').datepicker(
        dateFormat: 'dd.mm.yy',
        changeMonth: true,
        changeYear: true,
        selectOtherMonths: true
    );
);

在 Opera 和 Firefox 中一切正常,但 Chrome 不喜欢这种类型的日期。我不断收到以下错误The field 'Date' must be a date

有什么想法吗?

更新

当代码在局部视图中时似乎存在问题。当我将该代码复制到主页时,验证工作正常。

我在我的主视图中插入部分视图,就像这样:

@Html.Partial("_CreateOrEdit", Model)

上面的代码在局部视图中:

@model Pro.Web.Models.Model

<div class="editor-field">
@Html.TextBoxFor(model => model.Item.Date, new  @class = "picker" )
@Html.ValidationMessageFor(model => model.Item.Date)

$(document).ready(function () 
$('.picker').datepicker(
    dateFormat: 'dd.mm.yy',
    changeMonth: true,
    changeYear: true,
    selectOtherMonths: true
);

</script>
);

更新2

毕竟它不起作用。有时它有效,有时无效。我在日期上点击了几次,有时验证通过了。对于同一日期,可能有好的和错误的验证。

这是日期字段的输出 html:

<div class="editor-field">
<input class="picker" data-val="true" data-val-date="The field Date must be a date." data-val-required="The Date field is required." id="date" name="Item.Date" type="text" value="1.1.0001. 0:00:00" />
<span class="field-validation-valid" data-valmsg-for="Item.Date" data-valmsg-replace="true"></span>
</div>

【问题讨论】:

可能重复:***.com/questions/5966244/jquery-datepicker-chrome @DavidTansey - 这与我在第一段中给出的答案相同。我试过了,但还是一样。 对不起 dup / dup。 【参考方案1】:

这里的情况完全相同(部分视图)

我通过删除验证属性并在服务器端执行验证来解决它:

$('#date').removeAttr("data-val-date");

【讨论】:

这根本不是解决办法,就像裤子破了就脱掉一样。客户不会高兴的 ;)【参考方案2】:

在我看来,问题在于 MVC 正在为带有[type=date] 的日期 HTML5 输入生成。这导致 chrome 中的有效日期格式与系统日期格式相同。

您可以使用以下属性将 MVC 中的日期格式设置为与 JqueryUI 通用:

[DataType(DataType.Date), DisplayFormat( DataFormatString="0:dd.MM.yy", ApplyFormatInEditMode=true )]

第二个想法是使用文章中的代码:Creating a Native HTML 5 Datepicker with a Fallback to jQuery UI

还有一件事。 html输入中有一个关于日期的好话题:Is there any way to change input type="date" format?

【讨论】:

感谢您的回答。一些有用的信息,+1。我发现问题在于它在局部视图内。当我在主页中复制代码时,一切正常。我在主视图中插入部分视图:@Html.Partial("_CreateOrEdit", Model)。您是否知道它在局部视图中时不起作用的原因是什么? 你的输出 HTML 是什么样子的? 我为日期部分添加了输出 HTML。奇怪的是,在同一天,有时有效,有时无效。 here 是另一个可行的解决方案,希望有所帮助。【参考方案3】:

我通过删除验证属性解决了这个问题

@model Pro.Web.Models.Model

<div class="editor-field">
@ Html.EnableClientValidation(false); 
@Html.TextBoxFor(model => model.Item.Date, new  @class = "picker" )
@Html.ValidationMessageFor(model => model.Item.Date)
@ Html.EnableClientValidation(true); 

【讨论】:

【参考方案4】:

一年后参加聚会有点晚了,但我已经尝试了所有我能找到的关于这个错误的解决方案,但都没有帮助。因此,对于像我这样苦苦挣扎的人来说,这就是解决这个问题的方法。

在 jquery.validate.globalize.js 及其缩小版本(取决于您使用的)的末尾添加这个小 sn-p 代码。

... 
   $.validator.methods.range = function (value, element, param) 
        var val = Globalize.parseFloat(value);
        return originalMethods.range.call(this, val, element, param);
    ;


(jQuery, Globalize));

Globalize.culture("en-GB");

当然,在引号内使用您自己的文化设置。

希望对你有帮助!

【讨论】:

【参考方案5】:

问题似乎与&lt;input type="date" /&gt; (HTML5) 有关,因为specification 表示有效值定义为RFC3339。

所以我把我的视图改成了这样:

<script>
    $(function () 
         $("#validfrom").datepicker(
             altField: "#ValidFrom",
             altFormat: "yy-mm-dd"
         );
    );
</script>

<div class="editor-label">
    @Html.LabelFor(model => model.ValidFrom)
</div>
<div class="editor-field">
    <input id="validfrom" type="text" name="validfrom" />
    @Html.HiddenFor(model => model.ValidFrom)
    @Html.ValidationMessageFor(model => model.ValidFrom)
</div>

希望对你有帮助。

【讨论】:

【参考方案6】:

我有同样的错误。通过应用 datetime 作为类型来解决它,

 @Html.EditorFor(model => model.LineResetAllowStartDate, new  htmlAttributes = new  @class = "form-control" ,  @type = "datetime"  )

类似地只使用时间

 @Html.EditorFor(model => model.LineResetAllowStartDate, new  htmlAttributes = new  @class = "form-control" ,  @type = "time"  )

【讨论】:

以上是关于该字段必须是日期 - Chrome 中的 DatePicker 验证失败 - mvc的主要内容,如果未能解决你的问题,请参考以下文章

原生 chrome 日期选择器。年份字段中的六个字符

Chrome type="date" 和 jquery ui 日期选择器冲突

日期字段在 Chrome 浏览器中不显示值

oracle中如何修改日期类型的字段值

Django - 日期和时间字段说明

Laravel Eloquent 比较日期时间字段中的日期