为什么Html.TextBox正在渲染具有日期验证的字段

时间:2012-09-28 11:02:48

标签: jquery asp.net-mvc asp.net-mvc-4 unobtrusive-validation

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

@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 Validation库通过创建新的Date()验证日期,并且因为Chrome似乎总是将日期解析为en-US(完全忽略语言环境/语言设置),所以当我输入en-UK日期时它失败了。

3 个答案:

答案 0 :(得分:3)

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

您可以通过在Application_Start()中添加它来禁用它:

DataAnnotationsModelValidatorProvider.AddImplicitRequiredAttributeForValueTypes = false;

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

DateTime? EndTime;

答案 1 :(得分:1)

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

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

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

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

然后使用EndDate作为文本框字段,甚至使用TextBoxFor并将其映射到您的模型。您可以在帖子或设置的访问者中处理数据。

答案 2 :(得分:1)

  

为什么这个输入字段会添加data- *属性?

因为您已在应用程序中启用了不显眼的验证。默认情况下,MVC验证系统允许客户端验证所需的&amp;值类型的数据类型(整数,日期时间)。

  

为什么它甚至认为这是约会?

当您将字符串传递给Html.TextBox帮助器方法时,它会检查Model是否包含具有该名称的任何属性,在您的情况下,Model具有名称为{{1的属性其类型为EndTime

您正在传递仍代表DateTime类型的EndTime.DateDateTime有一个属性DateTime,其类型Date仅包含日期组件)因此MVC启用了两个验证。

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