Mac上的MVC3日期验证失败

本文关键字:验证 失败 日期 MVC3 上的 Mac | 更新日期: 2023-09-27 18:06:25

短版本:

我用ASP建立了一个简单的网站。NET MVC3,我遇到了一个关于日期字段、jQuery日期选择器、验证和Mac浏览器的特殊问题。简而言之,日期字段在PC上验证正确,但在Mac上失败(我尝试过Safari和Firefox(:Mac浏览器会触发验证,声称日期格式不正确,但事实并非如此。

长版本:

该模型是一个在EF4.1类中定义的"News"对象。我想稍微"扩充"一下这个类,告诉MVC框架属性"PublishOn"是一个日期,所以我添加了以下代码:

[MetadataType(typeof(NewsMetadata))]
public partial class News
{
    // ... 
}
public class NewsMetadata
{
    [DataType(DataType.Date)]
    [Display(Name="Publish on")]
    public DateTime PublishOn { get; set; }
}

然后,我在Views/Shared/EditorTemplates/中添加了一个模板,自动将"日期"css类属性添加到文本框中:

@model DateTime 
@Html.TextBox("", Model.ToString("dd-MM-yyyy"), new { @class = "date" })

最后,在我的编辑视图中,我加入了一些jQuery的魔力来获得漂亮的日期选择器:

<script src="@Url.Content("~/Scripts/jquery-1.5.1.min.js")" type="text/javascript"></script>
<script src="@Url.Content("~/Scripts/jquery.validate.min.js")" type="text/javascript"></script>
<script src="@Url.Content("~/Scripts/jquery.validate.unobtrusive.min.js")" type="text/javascript"></script>
<script src="@Url.Content("~/Scripts/jquery-ui-1.8.11.min.js")" type="text/javascript"></script>
<link href="@Url.Content("~/Content/themes/base/jquery.ui.all.css")" rel="stylesheet" type="text/css" />
<script type="text/javascript">
  $().ready(function () {
    $('.date').datepicker({ dateFormat: "dd-mm-yy" }); 
  });    
</script>

顺便说一句,关于dateFormat: "dd-mm-yy"参数的一个注意事项:如果我将其设置为"dd-mm-yyyy",则日期选择器设置的值是错误的,为双年度,即"01-01-20122012"!!!奇怪的

PublishOn属性是这样完成的:

<div class="editor-label">
  @Html.LabelFor(model => model.PublishOn)
 </div>
 <div class="editor-field">
   @Html.EditorFor(model => model.PublishOn)
   @Html.ValidationMessageFor(model => model.PublishOn)
 </div>

它发出这个HTML:

<div class="editor-label">
  <label for="PublishOn">Publish on</label>
</div>
<div class="editor-field">
  <input class="date" data-val="true" data-val-required="The Publish on field is required." id="PublishOn" name="PublishOn" type="text" value="22-12-2011" />
  <span class="field-validation-valid" data-valmsg-for="PublishOn" data-valmsg-replace="true"></span>
</div>

这在我电脑上的IE9上非常有效。但在Mac(包括Firefox和Safari(上,验证生效,并声称日期格式无效!

Mac上的MVC3日期验证失败

根据以上评论中的讨论:

禁用客户端验证使用

<script src="@Url.Content("~/Scripts/jquery-1.5.1.min.js")" type="text/javascript"></script>
<script src="@Url.Content("~/Scripts/jquery.validate.min.js")" type="text/javascript"></script>
<script src="@Url.Content("~/Scripts/jquery.validate.unobtrusive.min.js")" type="text/javascript"></script>
<script src="@Url.Content("~/Scripts/jquery-ui-1.8.11.min.js")" type="text/javascript"></script>
<link href="@Url.Content("~/Content/themes/base/jquery.ui.all.css")" rel="stylesheet" type="text/css" />
<script type="text/javascript">
  $().ready(function () {
    $('.date').datepicker({ constrainInput: false });
  });    
</script>

[EDIT]并从相应属性中删除[DataType(DataType.Date)][/EDIT]

请参阅jQuery参考资料http://jqueryui.com/demos/datepicker/#option-constrainInput