Good morning, I'm learning MVC using the music store examples on the www.asp.net/mvc page, and I am having a problem with my edit action adding a new entry into the database instead of updating the existing entry. Here is my Edit action and the HTTPPost Edit.
//
// GET: /HomeScroller/Edit/5
public ActionResult Edit(int id)
{
var viewModel = new HomeScrollerViewModel()
{
ScrollerLink = dataContext.ScrollerLinks.Single(s => s.SlideID == id)
};
return View(viewModel);
}
//
// POST: /HomeScroller/Edit/5
[HttpPost]
public ActionResult Edit(int id, FormCollection formValues)
{
var scrollerLink = dataContext.ScrollerLinks.Single(s => s.SlideID == id);
try
{
UpdateModel(scrollerLink, "ScrollerLink");
dataContext.SubmitChanges();
return RedirectToAction("Index");
}
catch(Exception ex)
{
var viewModel = new HomeScrollerViewModel()
{
ScrollerLink = scrollerLink,
HasError = true,
ErrorMessage = ex.Message
};
return View(viewModel);
}
}
To give a little more background on what I am doing, I have a shared template for my Edit/Create views, and on that shared template I have a jQuery popup with a form for uploading an image. This "HomeScroller" plays a slideshow on the homepage, and I've made a back end for the admin to come in and create new slides, edit, and delete them. The other issue I am having is that when I upload an image using that second form, the main form is cleared on the post back. How do I maintain the data in those fields? Thanks.
EDIT: Here is the code for my update action
[HttpPost]
public ActionResult Upload(HttpPostedFileBase file, F开发者_JS百科ormCollection formValues)
{
HomeScrollerViewModel viewModel;
Regex imageFilenameRegex = new Regex(@"(.*?)\.(jpg|jpeg|png|gif)$");
if (file.ContentLength > 0)
{
if (!imageFilenameRegex.IsMatch(file.FileName))
{
viewModel = new HomeScrollerViewModel()
{
ScrollerLink = new ScrollerLink(),
HasError = true,
ErrorMessage = "Image must be .jpg, .jpeg, .png, or .gif"
};
}
else
{
string filePath = Path.Combine(HttpContext.Server.MapPath("../Uploads"), Path.GetFileName(file.FileName));
file.SaveAs(filePath);
viewModel = new HomeScrollerViewModel()
{
ScrollerLink = new ScrollerLink()
{
ImageUrl = "../Uploads/" + file.FileName
}
};
return View("Create", viewModel);
}
}
else
{
viewModel = new HomeScrollerViewModel()
{
//ScrollerLink = scrollerLink,
HasError = true,
ErrorMessage = "Image is empty!? Try Again"
};
}
return View("Create");
}
I feel retarded for this one. In my update action, I am returning to the "Create" view, which is wrong if I am working with the "Edit" view, this is why it was adding a new object instead of modifying the existing. Also - I stored my viewmodel using TempData["HomeScrollerViewModel"] and passed my data around that way. Problem solved.
精彩评论