2014-01-09 2 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

Зачем загружать объект проблемы в переменную beforeEdit, если вы не планируете его использовать? – scheien

+0

Я пытался что-то вроде получения старого значения из существующих данных, но с ошибкой без изменений в сообщении об ошибке вы можете сказать бесполезный шаг – Sonic

+1

Не можете ли вы заполнить beforeEdit новыми данными, а затем сохранить это вместо этого? Загрузите его без AsNoTracking(), затем заполните UserId, путь изображения и т. Д. – scheien

ответ

1

Вы загружаете объект Проблемы в переменную beforeEdit, и нет никакого дальнейшего использования его.

Если вы попытаетесь обновить beforeEdit новыми данными из этого параметра и сохраните его вместо объекта, возвращаемого из представления.

Смежные вопросы