Фактическая проблема заключается как в DateTime
свойстве viewmodel, так и в этом TextBoxFor
помощнике:
@Html.TextBoxFor(m => m.Customer.BirthDate, "{0: dd-MM-yyy}", new { @class = "form-control" })
В зависимости от текущей настройки культуры, это сгенерирует простой ввод с указанным форматом даты, который может не совпадать с текущей настройкой культуры на сервере, что приводит к тому, что механизм связывания модели по умолчанию игнорирует его значение и использует DateTime.MinValue
в качестве значения по умолчанию (потому что это не так обнуляемый тип), который не подходит для datetime
типа столбца в SQL с минимальным значением 1753-01-01
(эквивалентный тип System.DateTime
в T-SQL равен 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);
}
}
Похожие проблемы: Дата ASP.NET MVC не сохраняется при публикации