2014-01-09 19 views
0

每一件事情發展順利,我所有讓我得到與價值的新模式進行修改,但東西,在最後步驟 出錯,我的模型驗證狀態爲真 值這是我的職務控制器如何解決這個修改控制器?

[HttpPost]  
    public ActionResult Edit(Problem problem, HttpPostedFileBase fileUpload) 
    { 
     Problem Edproblem = db.Problems.Find(problem.Id); 
     ViewBag.ATMId = new SelectList(db.ATMs, "Id", "AtmNumber", Edproblem.ATM.AtmNumber); 
     ViewBag.UserId = WebSecurity.GetUserId(User.Identity.Name); 
     ViewBag.ProblemTypeId = new SelectList(db.ProblemTypes, "Id", "Name", Edproblem.ProblemTypeId); 
     var bankId = from e in db.ATMs where e.Id == problem.ATMId select e; 
     ViewBag.BankId = new SelectList(db.Banks, "Id", "Name", bankId); 
     ViewBag.AreaId = new SelectList(db.Areas, "Id", "Name", db.Areas.Where(p => p.Id == Edproblem.ATM.AreaId)); 
     ViewBag.GovId = new SelectList(db.Governates, "Id", "Name", Edproblem.ATM.Area.GovernateId); 

     Problem beforeEdit = db.Problems.AsNoTracking().First(p => p.Id == problem.Id); 

     if (ModelState.IsValid) 
     { 
      DateTime now = DateTime.Now; 

      if (!Directory.Exists(Server.MapPath("~/UploadImages/" + now.ToString("yyyy_MM/")))) 
      { 
       Directory.CreateDirectory(Server.MapPath("~/UploadImages/" + now.ToString("yyyy_MM/"))); 
      } 
      if (!Directory.Exists(Server.MapPath("~/UploadImages/" + now.ToString("yyyy_MM/") + Edproblem.ATMId.ToString()))) 
      { 
       Directory.CreateDirectory(Server.MapPath("~/UploadImages/" + now.ToString("yyyy_MM/") + Edproblem.ATMId.ToString())); 
      } 
      if (!Directory.Exists(Server.MapPath("~/UploadImages/" + now.ToString("yyyy_MM/") + Edproblem.ATMId.ToString() + now.ToString("/dd/")))) 
      { 
       Directory.CreateDirectory(Server.MapPath("~/UploadImages/" + now.ToString("yyyy_MM/") + Edproblem.ATMId.ToString() + now.ToString("/dd/"))); 
      } 

      var image = WebImage.GetImageFromRequest(); 

      if (fileUpload != null) 
      { 
       string fileName = fileUpload.FileName.ToString(); 
       fileName = Guid.NewGuid().ToString() + fileName.Substring(fileName.LastIndexOf(".")); 
       fileName = now.ToString("yyyy_MM/") + problem.ATMId.ToString() + "/" + now.ToString("dd/") + fileName; 
       if (fileUpload != null && fileUpload.ContentLength > 0) 
        fileUpload.SaveAs(Server.MapPath("~/UploadImages/" + image)); 

       image.Save(Server.MapPath("/UploadImages/" + fileName));     

       problem.ImagePath = fileName; 
      } 
      else 
      {      
       if (problem.ImagePath == null) 
       { 
        var getPath = (from e in db.Problems 
            where e.Id == problem.Id 
            select e.ImagePath).ToList(); 
        problem.ImagePath = getPath[0].ToString(); 
       } 
      } 
      problem.UserId = WebSecurity.GetUserId(User.Identity.Name);     
      db.Entry(problem).State = EntityState.Modified;     
      db.SaveChanges(); 
      return RedirectToAction("Index"); 
     } 
     return View(problem); 
    } 

這是錯誤,因爲它恰好出現:

An object with the same key already exists in the ObjectStateManager. The ObjectStateManager cannot track multiple objects with the same key. 
+0

如果您不打算使用它,爲什麼要將一個Problem對象加載到變量beforeEdit中? – scheien

+0

我正在嘗試從存儲的數據中獲取舊值但錯誤消息中沒有任何更改 您可以說沒用的步驟 – Sonic

+1

難道您不能用新數據填充beforeEdit,然後保存那個嗎?加載它沒有AsNoTracking(),然後填充UserId,圖像路徑等。 – scheien

回答

1

你加載一個問題對象爲可變beforeEdit,並沒有進一步的利用它。

如果嘗試使用參數中的新數據更新beforeEdit,並保存該數據而不是從視圖返回的對象。