控制器中edit方法的传输参数中的DateTime始终为01.01.0001 00:00:00 asp.net mvc5

问题描述

我在编辑方法“问题”中的传输参数有问题。

在问题中,CreatedDate 和 UpdatedDate 始终为 {01.01.0001 00:00:00}。

参数 Id、Title 和 Description 始终正确。

我的控制器:

public ActionResult Edit([Bind(Include = "Id,Title,Description")] Issue issue)
{
    if (ModelState.IsValid)
    {
        db.Entry(issue).State = EntityState.Modified;
        db.SaveChanges();
        return RedirectToAction("Index");
    }

    return View(issue);
}

我的模型:

public class Issue : BaseEntity
{
    public int Id { get; set; }

    [required(ErrorMessage = "required")]
    public string Title { get; set; }
    
    [AllowHtml]
    [required(ErrorMessage = "required")]
    [DataType(DataType.MultilineText)]
    public string Description { get; set; }

}

public class BaseEntity
{
    public DateTime CreatedDate { get; set; }
    public DateTime UpdatedDate { get; set; }
}

不幸的是,我无法从“问题”参数的来源进行调试。

Edit 方法中的传输参数“Issue issue”从何而来,为什么所有 DateTimes 总是 {01.01.0001 00:00:00}?

当我第一次创建问题实体时,我在 SaveChanges() 方法添加了 DateTimme,并在我的 DBContext 中进行了以下修改

public override int SaveChanges()
{
    var entries = ChangeTracker
        .Entries()
        .Where(e => e.Entity is BaseEntity && (
                e.State == EntityState.Added
                || e.State == EntityState.Modified));

    foreach (var entityEntry in entries)
    {
        ((BaseEntity)entityEntry.Entity).UpdatedDate = DateTime.UtcNow;

        if (entityEntry.State == EntityState.Added)
        {
            ((BaseEntity)entityEntry.Entity).CreatedDate = DateTime.UtcNow;
        }
    }

    return base.SaveChanges();
}

并且 SaveChanges() 工作没有问题。当我第一次创建问题实体时,DateTime 具有正确的值,我也可以在详细信息视图中看到它。

解决方法

将您的编辑代码更改为此

var exist =  d.Set<Issue>().FindAsync(issue.Id);
 
if (exist == null)
                {
//ErrorMessage = "Can't find item to update";
                    
}
else{

    db.Entry(exist).CurrentValues.SetValues(issue);
    var result = await db.SaveChanges(); // result should be  > 0
}