项目更新时,CreatedAt字段变为空值

时间:2014-03-19 09:51:39

标签: c# asp.net-mvc json

我在更新商品时遇到问题。创建新项目时,CreatedAt值将填充当前时间&日期。编辑项目时,CreatedAt值立即设置为null。 UpdatedAt值已正确设置,但CreatedAt在数据库中设置为null。

这是ItemViewModel类:

public class ItemViewModel
{
    public int ItemId { get; set; }
    public string ItemName { get; set; }
    public int UserId { get; set; }
    public string CreatedBy { get; set; }
    public DateTime? CreatedAt { get; set; }
    public string UpdatedBy { get; set; }
    public DateTime? UpdatedAt { get; set; }

    public virtual User User { get; set; }
}

这是我使用的更新方法:

public void UpdateItem(ItemViewModel viewModel)
{
    item.UpdatedBy = WebSecurity.CurrentUserName;
    item.UpdatedAt = DateTime.Now;
    db.SaveChanges();
}

以下create方法正确填充CreatedAt值:

public int CreateItem(ItemViewModel viewModel)
{
    var item = new Item();
    viewModel.CopyToItem(item); 

    item.UserId = WebSecurity.CurrentUserId;
    item.CreatedBy = WebSecurity.CurrentUserName;
    item.CreatedAt = DateTime.Now;

    db.Items.Add(item);
    db.SaveChanges();
    return item.ItemId;
}

有没有我错过的东西?

3 个答案:

答案 0 :(得分:1)

您应该使用EntityState检查Entry是否已修改:

public void UpdateItem(ItemViewModel viewModel)
{
    var item=db.Table.where(x=>x.ID==viewModel.ID).FirstOrDefault();
    item.UpdatedBy = WebSecurity.CurrentUserName;
    item.UpdatedAt = DateTime.Now;
    db.Entry(item).state=EntityState.Modified;
    db.SaveChanges();
}

答案 1 :(得分:1)

在这种方法中:

public void UpdateItem(ItemViewModel viewModel)
{
    item.UpdatedBy = WebSecurity.CurrentUserName;
    item.UpdatedAt = DateTime.Now;
    db.SaveChanges();
}

viewModel来自哪里? (并且,想一想,什么是item?)这是一个客户端表单调用的动作吗?我怀疑这里发生的是客户端表单不包含CreatedAt的数据,因此模型绑定器在为此构建参数时将值保留为null方法

模型装订器不够聪明"获取模型的当前持久状态并将其与表单中的内容合并。 只有来自表单。所以你基本上有两个选择:

  1. 坚持使用页面的表单元素准确重新构建模型所需的所有数据。
  2. 至少在页面的表单元素中保留模型的标识符,在服务器端代码中使用该标识符从持久数据中重新获取模型的状态。
  3. 对于第一个选项,您需要包含CreatedAt。这可能是一件简单的事情:

    @Html.HiddenFor(model => model.CreatedAt)
    

答案 2 :(得分:0)

试试这个

 var data= db.Items.where(x=>x.ID==viewModel.ID).SingleOrDefault();
    foreach(db.Items in data)
    {
        item.UpdatedBy = WebSecurity.CurrentUserName;
        item.UpdatedAt = DateTime.Now;
    }
     db.SaveChanges();