MVC控制器会覆盖数据

时间:2017-01-21 16:56:20

标签: c# entity-framework asp.net-mvc-4 controller

我在模型added中有实体added_fromlast_editedlast_edited_fromProducts。如果有人创建了新的Product,则四个枚举实体将填充相应的数据;有了这一切都很好。如果有人正在编辑Product,则只会填充last_edited个实体,但我在控制器中的方法每次都会覆盖added个实体并清空它们。

控制器方法:

public ActionResult Edit(int? id)
        {
            if (id == null)
            {
                return new HttpStatusCodeResult(HttpStatusCode.BadRequest);
            }
            Product product= db.Product.Find(id);
            if (product== null)
            {
                return HttpNotFound();
            }
            ViewBag.Category_id = new SelectList(db.Category, "Id", "Name", product.Category_id);
            return View(product);
        }

        [HttpPost]
        [ValidateAntiForgeryToken]
        public ActionResult Edit([Bind(Include = "Id,Barcode,Name,Category_id,Comment")] Product product)
        {
            if (ModelState.IsValid)
            {
                product.last_edited = DateTime.Now;
                product.last_edited_from = User.Identity.GetUserId();
                db.Entry(product).State = EntityState.Modified;
                db.SaveChanges();
                return RedirectToAction("Index");
            }
            ViewBag.Category_id = new SelectList(db.Category, "Id", "Name", product.Category_id);
            return View(product);
        }

型号:

    public int Id { get; set; }

    public double Barcode { get; set; }

    [MinLength(3)]
    public string Name{ get; set; }

    [ForeignKey("Category_id")]
    public Category CategoryFK { get; set; }

    [Required]
    public int Category_id { get; set; }

    public DateTime? added { get; set; }

    [ForeignKey("added_from")]
    public ApplicationUser added_from_User { get; set; }

    public string added_from { get; set; }       

    public DateTime last_edited { get; set; }

    [ForeignKey("last_edited_from")]
    public ApplicationUser last_edited_from { get; set; }

    public string last_edited_from { get; set; }   

我尝试了约5个小时,但没有发现任何对我有帮助的事情

1 个答案:

答案 0 :(得分:0)

您的帖子在HTML中的含义是什么?我敢打赌它会覆盖这些值,因为你的值没有被传递回帖子。

您可以通过两种方式解决此问题:

  1. 更改HTML / Razor以包含“已添加”信息,以便在POST时包含该信息。 (不确定这是否已经发生)。

  2. 首先使用它的id进行查找并找到产品,然后正常修改属性。这是最好的选择,因为您不希望将数据库对象传递到视图(然后返回到POST)。产品查找的确切语法可能不合适,但它应足够接近,以便大致了解它正在做什么。

    [HttpPost]
    [ValidateAntiForgeryToken]
    public ActionResult Edit([Bind(Include = "Id,Barcode,Name,Category_id,Comment")] Product product)
    {
        if (ModelState.IsValid)
        {
            var productInDb = db.Products.First(x => x.Id == product.Id);
            productInDb.last_edited = DateTime.Now;
            productInDb.last_edited_from = User.Identity.GetUserId();
            db.Entry(productInDb).State = EntityState.Modified;
            db.SaveChanges();
            return RedirectToAction("Index");
        }
        ViewBag.Category_id = new SelectList(db.Category, "Id", "Name", product.Category_id);
        return View(product);
    }