I have a problem with update data in Asp.net MVC 5 with Razor Engine .
my Update code works fine but I have some problems with it . When I update Image , old image stays in Images folder. I want to delete old image if it changed . and I want to stay old image if it didn't change .
How can I do it ?
Thanks a lot for any help
I don't know how write if statement for this :/
CarouselRepositories.cs
public bool Update(NP1.Models.Carousel entity, bool autoSave = true)
{
try
{
db.Carousels.Attach(entity);
db.Entry(entity).State = System.Data.Entity.EntityState.Modified;
if (autoSave)
return Convert.ToBoolean(db.SaveChanges());
else
return false;
}
catch
{
return false;
}
}
Admin controller
[HttpGet]
public ActionResult EditCarousel(int id)
{
var load = db.Carousels.Find(id);
return View(load);
}
[HttpPost]
public ActionResult EditCarousel(Carousel carousel, HttpPostedFileBase UploadImage)
{
CarouselRepositories blCarousel = new CarouselRepositories();
string path = "";
var fileName = "";
var rondom = "";
if (UploadImage != null)
{
fileName = Path.GetFileName(UploadImage.FileName);
rondom = Guid.NewGuid() + fileName;
path = System.IO.Path.Combine(
Server.MapPath("~/Images/Carousel"), rondom);
carousel.CarouselImage = rondom;
}
if (ModelState.IsValid)
{
UploadImage.SaveAs(path);
carousel.CarouselImage = rondom;
if (blCarousel.Update(carousel))
{
return JavaScript("alert('Carousel slide added');");
}
else
{
return JavaScript("alert('didn't add');");
}
}
else
{
return JavaScript("alert('Error');");
}
}
EditCarousel.cshtml:
@model NP1.Models.Carousel
@{
ViewBag.Title = "EditCarousel";
Layout = "~/Views/Admin/AdminLayout.cshtml";
}
@using (Html.BeginForm("EditCarousel", "Admin", FormMethod.Post, new { enctype = "multipart/form-data", id = "myUploadForm" }))
{
@Html.AntiForgeryToken()
<div class="form-horizontal">
@Html.ValidationSummary(true)
@Html.HiddenFor(model => model.CarouselID)
<div class="form-group">
@Html.LabelFor(model => model.CarouselSubject, new { @class = "control-label col-md-2" })
<div class="col-md-10">
@Html.EditorFor(model => model.CarouselSubject)
@Html.ValidationMessageFor(model => model.CarouselSubject)
</div>
</div>
<div class="form-group">
@Html.LabelFor(model => model.CarouselInfo, new { @class = "control-label col-md-2" })
<div class="col-md-10">
@Html.EditorFor(model => model.CarouselInfo)
@Html.ValidationMessageFor(model => model.CarouselInfo)
</div>
</div>
<div class="form-group">
@Html.LabelFor(model => model.CarouselImage, new { @class = "control-label col-md-2" })
<div class="col-md-10">
@*@Html.EditorFor(model => model.CarouselImage)*@
@Html.ImageFor(model => model.CarouselImage, new {width="300"},"","Images","Carousel")
@Html.Upload("UploadImage")
@Html.HiddenFor(model => model.CarouselImage)
</div>
</div>
<div class="form-group">
<div class="col-md-offset-2 col-md-10">
<input type="submit" value="Save" class="btn btn-default" />
</div>
</div>
</div>
}
Updated Amin Controller :
[HttpPost]
public ActionResult EditCarousel(Carousel carousel, HttpPostedFileBase UploadImage)
{
CarouselRepositories blCarousel = new CarouselRepositories();
string path = "";
var fileName = "";
var rondom = "";
if (UploadImage != null)
{
fileName = Path.GetFileName(UploadImage.FileName);
rondom = Guid.NewGuid() + fileName;
path = System.IO.Path.Combine(
Server.MapPath("~/Images/Carousel"), rondom);
carousel.CarouselImage = rondom;
}
else
{
fileName = carousel.CarouselImage;
path = System.IO.Path.Combine(
Server.MapPath("~/Images/Carousel"), fileName);
}
if (ModelState.IsValid)
{
UploadImage.SaveAs(path); // I got error in this line
carousel.CarouselImage = rondom;
if (blCarousel.Update(carousel))
{
return JavaScript("alert('Carousel slide added');");
}
else
{
return JavaScript("alert('didn't add');");
}
}
else
{
return JavaScript("alert('Error');");
}
}
UploadImageis notnullin the POST method, then you want to delete the existing image?UploadImageto benullI get error , I spend 2-3 days but I couldn't fix it . @StephenMueckeCarouselImagecontains the file name of the existing image, then its value will posted back (you have a hidden input for it) so its just a matter of deleting it (usingSystem.IO.File.Delete()) before you callUploadImage.SaveAs(path);(or better, just use the existing file name so its overwritten)UploadImageisnull?