在我的测试应用程序中,我有一个datetime字段定义如下:
[Required(ErrorMessage = "This is required")]
[Display(Name = "test date:")]
[DataType(DataType.Date)]
[DisplayFormat(DataFormatString = "{0:dd/MMMM/yyyy}", ApplyFormatInEditMode = true)]
public DateTime? date1 { get; set; }
在我看来:
@Html.EditorFor(
model => model.date1,
new {
htmlAttributes = new {
@Value = Model.date1 != null ? Model.date1.Value.ToString("yyyy-MM-dd") : ""
}
})
@Html.ValidationMessageFor(model => model.date1, "", new { @class = "text-danger" })
一切正常但是当我输入像10/03/19999(dd,MM,yyyyy)这样的日期时,应用程序会中断,显然我输入的日期是错误的,但我不确定如何操作错误。我已经尝试使用datetime.tryparse回发失败,但后来我失去了填写表单的内容。
更新
关于quadzz解决方案,我尝试过:
[Required(ErrorMessage = "This is required")]
[Display(Name = "test date:")]
[DataType(DataType.Date)]
[Range(typeof(DateTime), "1/1/1900", "31/12/2000", ErrorMessage = "Value for {0} must be between {1} and {2}")]
[DisplayFormat(DataFormatString = "{0:dd/MM/yyyy}", ApplyFormatInEditMode = true)]
但它仍然不起作用。
答案 0 :(得分:2)
尝试测距日期时间字段。 参考此处:https://msdn.microsoft.com/en-us/library/system.componentmodel.dataannotations.rangeattribute.aspx
示例:
[Range(typeof(DateTime), "1/1/2000", "1/1/2010",
ErrorMessage = "Value for {0} must be between {1:d} and {2:d}")]
[DataType(DataType.Date)]
答案 1 :(得分:1)
在将数据发送到服务器之前执行客户端验证。虽然还需要服务器端验证,但客户端验证可以处理您的场景,以便在布局文件中包含以下js文件
所以你的观点应该像
@Html.EditorFor(
model => model.date1,
new {
htmlAttributes = new {
@Value = Model.date1 != null ? Model.date1.Value.ToString("yyyy-MM-dd") : "",
@Readonly="readonly"
}
})
@Html.ValidationMessageFor(model => model.date1, "", new { @class = "text-danger" })
我已经使编辑器只读,以便用户从datepicker库中选择日期(禁止手动日期输入)[尽管可以轻松绕过]
如果通过客户端验证或客户端通过禁用javascript提交数据,则需要执行服务器端验证,这可以通过检查ModelState在控制器中完成
[HttpPost]
public ActionResult Employee(EmployeeModel employee)
{
if(ModelState.IsValid)
{
//Everything is good to process
}
return View(employee);//returns view with model error if any
}
答案 2 :(得分:0)
一些解决方案:
添加客户端验证以在将日期发送到服务器之前检查日期(当然也保持您现在所做的服务器验证)。这样做可以将问题减少到几乎无关紧要的情况(那些没有启用javascript并输入错误日期的用户)。
或另一种解决方案:
将date1字段更改为字符串。如果您的日期不正确,请将原始值发回您的页面。
DateTime date;
if (DateTime.TryParse(date1, out temp))
{
//The date is fine, save it.
}
else
{
ModelState.AddError("date1", "Incorrect date: " + date1);
}
然后在您的编辑器中,您只需显示一个普通的文本字段,而不需要进行转换。