ASP.NET MVC 6:文件输入为空时保留原有数据的实现方案
解决方案
你的核心问题是编辑逻辑错误:当前用Add方法处理编辑操作,这会直接插入新记录而非更新原有数据,且未保留原有图片URL。按以下方式修改控制器方法即可解决:
修改后的控制器编辑方法
//POST [HttpPost] [ValidateAntiForgeryToken] public async Task<ActionResult> UrunDuzenle([FromForm] Urunler obj) { if (ModelState.IsValid) { // 从数据库获取待编辑的原有产品记录 var existingUrun = _db.tblUrunler.FirstOrDefault(u => u.UrunID == obj.UrunID); if (existingUrun == null) { return NotFound(); } // 更新除图片外的所有字段 existingUrun.SKU = obj.SKU; existingUrun.UrunAdi = obj.UrunAdi; existingUrun.UrunAciklamasi = obj.UrunAciklamasi; existingUrun.UrunKategorisi = obj.UrunKategorisi; existingUrun.UrunFiyati = obj.UrunFiyati; existingUrun.StokDurumu = obj.StokDurumu; existingUrun.RenkSecenekleri = obj.RenkSecenekleri; existingUrun.BoyutSecenekleri = obj.BoyutSecenekleri; existingUrun.Indirim = obj.Indirim; existingUrun.TedarikciID = obj.TedarikciID; existingUrun.GelisFiyati = obj.GelisFiyati; // 处理图片上传逻辑 if (obj.Gorsel != null) { // 可选:删除旧图片,避免服务器冗余存储 if (!string.IsNullOrEmpty(existingUrun.GorselURL)) { var oldImagePath = Path.Combine(_webHostEnvironment.WebRootPath, existingUrun.GorselURL); if (System.IO.File.Exists(oldImagePath)) { System.IO.File.Delete(oldImagePath); } } // 上传新图片并更新URL string folder = "images/products/"; folder += Guid.NewGuid().ToString() + "_" + obj.Gorsel.FileName; existingUrun.GorselURL = folder; string serverFolder = Path.Combine(_webHostEnvironment.WebRootPath, folder); await obj.Gorsel.CopyToAsync(new FileStream(serverFolder, FileMode.Create)); } // 若未上传新图片,直接保留原有GorselURL值 _db.tblUrunler.Update(existingUrun); _db.SaveChanges(); TempData["success"] = "Ürün düzenleme başarılı"; return RedirectToAction("Index"); } return View(obj); }
关键修改说明
- 替换
Add为先查询原有记录再更新的逻辑,确保是编辑操作而非新增 - 仅在用户上传新图片时才更新
GorselURL,未上传时自动保留原有值 - 可选添加旧图片删除逻辑,清理服务器无用文件
内容的提问来源于stack exchange,提问作者kmr
相关产品推荐
相关产品推荐

