4

我将视图模型中的 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()的 .

4

3 回答 3

3

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

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

DataAnnotationsModelValidatorProvider.AddImplicitRequiredAttributeForValueTypes = false;

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

DateTime? EndTime;
于 2012-10-02T14:58:17.343 回答
1

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

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

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

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

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

于 2012-10-01T17:01:53.380 回答
1

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

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

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

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

您传递EndTime.Date的仍然表示类型DateTimeDateTime具有类型的属性DateDateTime包含日期组件),因此 MVC 启用了两个验证。

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

于 2012-10-04T10:58:53.637 回答