我将视图模型中的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">
这个意外验证的一个有趣的副作用是它导致字段被验证为日期(这是我想要的巧合),但是jquery决定使用错误的日期格式所以我得到错误:
“字段日期必须是日期。”
<小时/> 的更新: 原来“错误的日期格式”错误是由Chrome中的错误引起的。因为JQuery Validation库通过创建新的
Date()
验证日期,并且因为Chrome似乎总是将日期解析为en-US(完全忽略语言环境/语言设置),所以当我输入en-UK日期时它失败了。
答案 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.Date
(DateTime
有一个属性DateTime
,其类型Date
仅包含日期组件)因此MVC启用了两个验证。
我建议你们两个创建两个不同的属性来存储日期和时间。