我向我的客户模型添加了一个属性,创建了一个迁移并更新了数据库。在DB中创建的字段是datetime。这是我的模型代码
public DateTime BirthDate { get; set; }这里的视图实际上是一个表单,我在其中插入日期和其他字段并提交表单。
<div class="form-group">
@Html.LabelFor(m => m.Customer.BirthDate)
@Html.TextBoxFor(m => m.Customer.BirthDate, "{0: dd-MM-yyyy}", new { @class = "form-control" })
</div>这是控制器中的动作
public ActionResult Save(Customer customer)
{
if (customer.Id == 0)
{
_context.Customers.Add(customer);
}
else
{
var customerInDb = _context.Customers.Single(c => c.Id == customer.Id);
customerInDb = customer;
}
_context.SaveChanges();
return RedirectToAction("Index", "Customers");
}我用23/04/1976编写了BirthDate字段,调试了应用程序并检查了customer.BirthDate的值,即23/04/1976 12:00:00日期是1753/1/1之前的备注,但我正在收到上述例外。
我还尝试了以下几种方法:
public DateTime? BirthDate { get; set; }异常已消失,但日期未保存到数据库。
从视图中删除甲酸"{0: dd-MM-yyy}“,但徒劳无功。
插入日期以不同的格式,如23-4月-1952年,1985-12-01和1987/1/2,但没有工作。
Visual 2013和数据库是visual的LocalDb。
发布于 2018-11-06 21:48:47
错误通过使属性为空而消失这一事实给出了答案。如果设置了一个值,那么您将得到与字段为而不是可空时完全相同的错误。
因此,没有设置值,如果字段为空(通过您说它不存储值-它正在存储空值),它将存储一个空值。
因此,对于不可空属性,当未设置属性时,它将具有点net DateTime的默认值,即DateTime.MinValue,如果将其存储在SQL server datetime2中,而不是存储在datetime中,则该值是有效的,在datetime中将得到1753错误。
顺便说一句,我假设这个LocalDb基本上是基于1753错误的server。为了记录在案,您应该在SQL server中使用datetime2:DateTime2 vs DateTime in SQL Server。
但是这个字段实际上是一个日期,所以您应该使用date SQL类型。
因此,总之,我怀疑传递给保存方法的客户中的BirthDate值具有DateTime.MinValue值。现在你得弄清楚为什么..。(但这是另一个问题)
你是故意使用dd-MM-yyy的吗?是否应该有额外的y
发布于 2018-11-07 01:52:33
实际问题在于DateTime视图模型属性和这个TextBoxFor助手:
@Html.TextBoxFor(m => m.Customer.BirthDate, "{0: dd-MM-yyy}", new { @class = "form-control" })根据当前区域性设置,这将生成具有指定日期格式的普通输入,该格式可能与服务器中的当前区域性设置不匹配,从而导致默认模型绑定器忽略其值,并使用DateTime.MinValue作为默认值(因为它不是可空类型),这不适合于最小值为1753-01-01的datetime列类型(T中等效的System.DateTime类型是datetime2)。
最建议为DateTime属性创建输入助手的设置是使用DataTypeAttribute设置为DataType.Date和DisplayFormatAttribute来指定格式字符串:
[DataType(DataType.Date)]
[DisplayFormat(DataFormatString = "{0:dd/MM/yyyy}", ApplyFormatInEditMode = true)]
public DateTime BirthDate { get; set; }然后,使用EditorFor或TextBoxFor和type="date"属性生成日期输入:
@* TextBoxFor *@
@Html.TextBoxFor(model => model.Customer.BirthDate, new { @class = "form-control", type = "date" })
@* EditorFor *@
@Html.EditorFor(model => model.Customer.BirthDate, new { htmlAttributes = new { @class = "form-control" } })注意:与上述设置相同的也适用于Nullable<DateTime>/DateTime?属性。
此外,在使用IsValid之前,您应该检查ModelState的SaveChanges()属性,并在验证失败时返回相同的视图:
[HttpPost]
public ActionResult Save(Customer customer)
{
if (ModelState.IsValid)
{
if (customer.Id == 0)
{
_context.Customers.Add(customer);
}
else
{
var customerInDb = _context.Customers.Single(c => c.Id == customer.Id);
customerInDb = customer;
}
_context.SaveChanges();
return RedirectToAction("Index", "Customers");
}
else
{
// validation failed, show the form again with validation errors
return View(customer);
}
}https://stackoverflow.com/questions/53177030
复制相似问题