ASP.NET 更新后未删除核心旧映像

ASP.NET Core Old image isn't deleted after update

我是初学者。更新一个实体对象,也就是一张图片,旧的图片并没有被删除,虽然方法里都写了。我不明白为什么 ImageUrl 为空。 当我得到对象 ImageUrl 时,当我尝试更新时 ImageUrl 是空的。

后端:

[HttpPost]
    [ValidateAntiForgeryToken]
    public async Task<IActionResult> Upsert(Department item)
    {
        if (ModelState.IsValid)
        {
            string webRootPath = _webHost.WebRootPath;
            var files = HttpContext.Request.Form.Files;

            if (files.Count > 0)
            {
                string fileName = Guid.NewGuid().ToString();
                var uploads = Path.Combine(webRootPath, @"images\department");
                var extenstion = Path.GetExtension(files[0].FileName);

                if (item.ImageUrl != null) // ImageUrl is null (0_0)
                {
                    // Update data with image
                    var imagePath = Path.Combine(webRootPath, item.ImageUrl.TrimStart('\'));

                    if (System.IO.File.Exists(imagePath))
                    {
                        System.IO.File.Delete(imagePath);
                    }
                }

                using (var fileStreams = new FileStream(Path.Combine(uploads, fileName + extenstion), FileMode.Create))
                {
                    await files[0].CopyToAsync(fileStreams);
                }

                item.ImageUrl = @"\images\department\" + fileName + extenstion;
            }
            else
            {
                // Update data without update image
                if (item.Id != 0)
                {
                    var model = await _db.Departments.FindAsync(item.Id);
                    item.ImageUrl = model.ImageUrl;
                }
            }

            if (item.Id == 0)
            {
                await _db.Departments.AddAsync(item);
            }
            else
            {
                _db.Departments.Update(item);
            }

            await _db.SaveChangesAsync();

            return RedirectToAction(nameof(Index));
        }
        else
        {
            if (item.Id != 0)
            {
                item = await _db.Departments.FindAsync(item.Id);
            }
        }

        return View(item);
    }

前端

@model Department
        
 @{
     var title = "Add";
  }
    
    <div class="container">
        <form method="post" enctype="multipart/form-data">
            <div class="row p-2 border" style="margin-top:10%;">
                <div asp-validation-summary="ModelOnly" class="text-danger"></div>
    
                @if (Model.Id != 0)
                {
                    // Edit
                    title = "Edit";
                    <input type="hidden" asp-for="Id" />
                }
    
                <div class="col-12 border-bottom">
                    <h3>@title</h3>
                </div>
    
                <div class="col-12 pt-4">
    
                    @if (Model.Id != 0)
                    {
                        <div class="form-group row p-2">
                            <img src="@Model.ImageUrl" />
                        </div>
                    }
    
                    <div class="form-group row">
                        <div class="col-4">
                            <label asp-for="Name"></label>
                        </div>
                        <div class="col-8">
                            <input asp-for="Name" class="form-control" />
                            <span asp-validation-for="Name" class="text-danger"></span>
                        </div>
                    </div>
    
                    <div class="form-group row">
                        <div class="col-4">
                            Image
                        </div>
                        <div class="col-8">
                            <input type="file" name="files" id="uploadBox" multiple class="form-control" />
                        </div>
                    </div>
    
                    <div class="form-group row">
                        <div class="col-4">
                            <label asp-for="Address"></label>
                        </div>
                        <div class="col-8">
                            <input asp-for="Address" class="form-control" />
                            <span asp-validation-for="Address" class="text-danger"></span>
                        </div>
                    </div>
    
                    <div class="form-group row">
                        <div class="col-4">
                            <label asp-for="Phone"></label>
                        </div>
                        <div class="col-8">
                            <input asp-for="Phone" class="form-control" />
                            <span asp-validation-for="Phone" class="text-danger"></span>
                        </div>
                    </div>
    
                    <div class="form-group row">
                        <div class="col-4">
                            <label asp-for="Description"></label>
                        </div>
                        <div class="col-8">
                            <textarea asp-for="Description" class="form-control" rows="15"></textarea>
                        </div>
                    </div>
    
                    <div class="form-group row">
                        <div class="col-8 offset-4">
                            @if (Model.Id != 0)
                            {
                                <partial name="_EditAndBackToListButton" model="Model.Id" />
                            }
                            else
                            {
                                <div class="row">
                                    <div class="col">
                                        <button type="submit" onclick="return validateInput()" class="btn btn-sm btn-outline-success form-control">Add</button>
                                    </div>
                                    <div class="col">
                                        <a asp-action="Index" class="btn btn-sm btn-outline-primary form-control text-center">Back</a>
                                    </div>
                                </div>
                            }
                        </div>
                    </div>
                </div>
            </div>
        </form>
    </div>

我的GitHubhttps://github.com/ValencyJacob/DepartmentManagment/blob/master/DepartmentManagment/Controllers/DepartmentController.cs

如果你的意思是 Upsert(Department item) 中的 item.ImageUrl(old ImgUrl) 当你更新对象时,你需要添加隐藏输入来绑定 view.Here 中的 ImageUrl 是一个演示-:

查看:

...

    @if (Model.Id != 0)
                    {
                        <div class="form-group row p-2">
                            <img src="@Model.ImageUrl" />
                            <input hidden asp-for="ImageUrl" />
                        </div>
                    }
...

结果: