C# MVC-如何解决“问题”;SqlException:将datetime2数据类型转换为datetime数据类型导致值超出范围。”;
我有一个模型,它有一个DateTime属性,用于存储创建对象的日期C# MVC-如何解决“问题”;SqlException:将datetime2数据类型转换为datetime数据类型导致值超出范围。”;,c#,asp.net-mvc,datetime,C#,Asp.net Mvc,Datetime,我有一个模型,它有一个DateTime属性,用于存储创建对象的日期 public class UserProfile { public int Id { get; set; } public string Name { get; set; } [Required] [DataType(DataType.Date)] public DateTime DateCreated { get; set; } } 创建用户配置文件时,在create方法中设置Da
public class UserProfile
{
public int Id { get; set; }
public string Name { get; set; }
[Required]
[DataType(DataType.Date)]
public DateTime DateCreated { get; set; }
}
创建用户配置文件时,在create方法中设置DateCreated,如下所示:
profile.DateCreated = DateTime.Now.Date;
但是在我的编辑方法中,我不想更改这个DateCreated值,所以我将其从Include属性中删除
即使如此,一个日期时间值01/01/0001仍被传递给模型,尽管我不希望该字段被更新。这就是导致SqlException的原因,但我不知道如何停止它
[HttpPost]
[ValidateAntiForgeryToken]
public ActionResult Edit([Bind(Include = "Id,Name")] UserProfile profile)
{
if (ModelState.IsValid)
{
db.Entry(profile).State = EntityState.Modified;
db.SaveChanges();
return RedirectToAction("Index");
}
return View(profile);
}
我尝试删除[Required]属性,但仍然没有解决
我通过添加一个?在DateTime之前
public DateTime? DateCreated { get; set; }
但这导致在我编辑用户配置文件时,DateCreated变为null。的可能重复项请勿在视图中使用数据模型,尤其是在编辑数据时。使用视图模型(不包括创建日期的属性)。在POST方法中,根据ID获取数据模型并更新其属性,然后保存它。如果希望使用数据模型,可以保留include并在视图中添加
@Html.HiddenFor(…)
,以便保留value@Rafalon“…在视图中添加@Html.HiddenFor(…),以便保留该值”如果用户是恶意的,则不会保留该值。一般来说,依赖客户来完成这项工作是不好的做法。实际上,这是两种不好的做法合一。正如@StephenMuecke所指出的,您不应该使用实体作为视图模型,但是如果OP没有直接保存发布的实体,即使这样也不会成为问题,这总是一个可怕的想法。您应该始终从一个新的实体实例(新建或从数据库中获取)开始,然后将发布的值映射到该实例上,最后保存该实例。这将确保1)实体是绑定到上下文的属性,2)只有您希望可编辑的值才是可编辑的。