在POST控制器中提交表单之前检查值

时间:2015-01-27 00:01:29

标签: asp.net asp.net-mvc

很抱歉,如果主题不准确,但基本上在提交表格后我想比较模型的外键的先前价值。

我的模特是:

public class Booking
{
    public int ID { get; set; }

    [ForeignKey("Store")]
    public int StoreID { get; set; }
    public virtual Store Store { get; set; }

    public string BookedBy { get; set; }
    public DateTime? DateBooked { get; set; }
    public string Description { get; set; }
    public DateTime FromDate { get; set; }
    public DateTime ToDate { get; set; }

    public string Status { get; set; }
}

在编辑视图中编辑预订并提交后,我想检查StoreID是否已被修改,以便我可以执行必要的操作。

我创建了一个Booking为oldBooking的实例,然后将StoreID与从View传回的booking.StoreID进行比较,但是当我保存已编辑的表单时,这会创建一个附加错误。

有什么建议吗?

2015年1月27日编辑:

public ActionResult Edit([Bind(Include = "ID,StoreID,BookedBy,DateBooked,Agreement,Description,FromDate,ToDate")] Booking booking, string returnURL)
{
  if (ModelState.IsValid)
  {
    Booking oldBooking = db.Bookings.Find(booking.ID);
    int prevStoreID = oldBooking.StoreID;
    db.Entry(booking).State = EntityState.Modified;
    db.SaveChanges();
    if(prevStoreID == booking.StoreID)
    {
      sendStoreChangeEmail(prevStoreID, booking.StoreID);
    }
    return RedirectToAction("Index", "Home", null);
  }
  ViewBag.StoreID = new SelectList(db.Stores, "ID", "ID", booking.StoreID);
  return View(booking);
}

尝试更新数据库条目状态时出现此错误:

  

"附加类型为'uatlab2.Models.Booking'的实体失败,因为同一类型的另一个实体已具有相同的主键值。使用'附加'方法或将实体的状态设置为“未更改”#39;或者'修改'如果图中的任何实体具有冲突的键值。这可能是因为某些实体是新的并且尚未收到数据库生成的键值。在这种情况下,请使用'添加'方法或“添加”#39;实体状态跟踪图形,然后将非新实体的状态设置为“未更改”。或者'修改'酌情。"

1 个答案:

答案 0 :(得分:0)

在阅读了几篇其他帖子并使用Google搜索分离后,我读了这篇文章: ASP MVC How to update DB entry with collections field

在我获得prevStoreID后执行此操作: ((IObjectContextAdapter)分贝).ObjectContext.Detach(oldBooking);

它有效。

感谢您的帮助和鼓舞。

C