【问题标题】:MVC Controller overwrites dataMVC 控制器覆盖数据
【发布时间】:2017-01-21 16:56:20
【问题描述】:

我在模型Products 中有实体added,added_from,last_edited,last_edited_from。如果有人创建了一个新的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 个小时,但没有发现对我有什么帮助

【问题讨论】:

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


    【解决方案1】:

    您的帖子在 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);
      }
      

    【讨论】:

    • 第二个对我来说是个不错的选择,我已经怀疑过类似的东西,但我并没有真正明白......:S
    猜你喜欢
    • 2019-07-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-02-04
    • 1970-01-01
    • 2015-07-10
    • 1970-01-01
    • 2012-03-25
    相关资源
    最近更新 更多