Jquery 为什么Html.TextBox呈现带有日期验证的字段

Jquery 为什么Html.TextBox呈现带有日期验证的字段,jquery,asp.net-mvc,asp.net-mvc-4,unobtrusive-validation,Jquery,Asp.net Mvc,Asp.net Mvc 4,Unobtrusive Validation,我正在将视图模型中的日期时间字段渲染为两个单独的表单字段(日期和时间)。我认为这一行代码: @Html.TextBox("EndTime.Date", Model.EndTime.ToShortDateString()) 其呈现为: <input data-val="true" data-val-date="The field Date must be a date." data-val-required="The Date field is required." id="Start

我正在将视图模型中的日期时间字段渲染为两个单独的表单字段(日期和时间)。我认为这一行代码:

@Html.TextBox("EndTime.Date", Model.EndTime.ToShortDateString())
其呈现为:

<input data-val="true" data-val-date="The field Date must be a date." 
 data-val-required="The Date field is required." id="StartTime_Date"
 name="StartTime.Date" type="text" value="29/09/2012">

  • 为什么这个输入字段添加了data-*属性
  • 为什么它甚至认为这是一次约会
这种意外验证的一个有趣的副作用是,它导致字段被验证为日期(这是我碰巧想要的),但jquery决定使用错误的日期格式,因此我得到了错误:

“字段日期必须是日期。”


更新:
事实证明,“错误的日期格式”错误是由Chrome中的一个错误引起的。因为JQuery验证库通过创建一个新的
date()
来验证日期,并且因为Chrome似乎总是将日期解析为en-US(完全忽略区域设置/语言设置),所以当我输入en-UK日期时失败。

当您使用与模型对象相同的表单名称时,我遇到了类似的问题。。。表单会自动将其与模型关联

如果您计划在表单提交后自己处理日期/时间值,则可以在模型上创建字段

private string _endDate;
public string EndDate 
    {
        get
        {
            if (_endDate == null)
                _endDate = EndTime.ToShortDateString();

            return _endDate;
        }
        set
        {
            _endDate = value;
        }
    }

然后使用EndDate作为文本框字段,甚至使用TextBoxFor并将其映射到模型。您可以随后在post或set访问器中处理数据。

有时,您可能会得到不需要的验证字段,即使您没有明确向该属性添加验证属性

您可以通过在应用程序_Start()中添加此选项来禁用此功能:

此外,可以解决您的问题的是,您的property Model.EndTime应该允许空值:

DateTime? EndTime;
为什么这个输入字段添加了data-*属性

因为您已经在应用程序中启用了不引人注目的验证。默认情况下,MVC验证系统支持对值类型(integer、datetime)的required和datatype进行客户端验证

为什么它甚至认为这是一次约会

当您将字符串传递给
Html.TextBox
helper方法时,它会检查
Model
是否包含任何具有该名称的属性,在您的示例中,
Model
有一个名为
EndTime
的属性,该属性的类型为
DateTime

您正在传递的
EndTime.Date
仍然表示类型
DateTime
DateTime
具有类型为
DateTime
的属性
Date
仅包含日期组件),因此这两个验证由MVC启用


我建议你们两个创建两个不同的属性来存储日期和时间。

查看MVC源代码,它似乎在根据字段名采取操作。调查仍在继续……我感觉这与我在名字中使用的型号前缀“.”有关
DateTime? EndTime;