Witajcie. Mam dziwną sytuację. W klasie konstruktora posiadam 2 metody, które są akcjami public ActionResult Edit(int? productId)
oraz public ActionResult EditPost(ProductViewModel productVM)
. Druga metoda posiada też atrybut [HttpPost, ActionName("Edit")]
, powinna być ona wywołana po wypełnieniu formularza w widoku Edit.cshtml
. A nie jest. I do końca nie wiem dlaczego. Żaden breakpoint w EditPost
nie jest odpalony. Po wysłąniu formularza po prostu przenosi mnie do Index.cshtml
. Może będziecie w stanie mi podpowiedzieć gdzie szukać przyczyny?
@UPDATE:
Metody Edit i EditPost z konstruktora:
public ActionResult Edit(int? productId)
{
if (productId == null)
{
return NotFound();
}
var productDb = _context.Products.FirstOrDefault(o => o.ProductID == productId);
if (productDb == null)
{
return NotFound();
}
string[] zmiana = productDb.BradIds.Split(',');
int[] zmieniony = new int[zmiana.Length];
for (int i =0; i<zmiana.Length; i++)
{
if (zmiana[i] != "")
{
zmieniony[i] = Int32.Parse(zmiana[i]);
}
}
//loading VM
productVM.ProductID = productDb.ProductID;
productVM.Name = productDb.Name;
productVM.Category = productDb.Category;
productVM.Description = productDb.Description;
productVM.Price = productDb.Price;
productVM.ProductIDs = zmieniony;
productVM.Products = PopulateProducts(); //populating dropdown
return View(productVM); //returning viewmodel
}
//POST
[HttpPost, ActionName("Edit")]
public ActionResult EditPost(ProductViewModel productVM)
{
int productId = productVM.ProductID;
productVM.Products = PopulateProducts();//productVM.Products przybiera to co zwraca dropdown
if (productVM.ProductIDs != null)
{
Product productDb = _context.Products.FirstOrDefault(o => o.ProductID == productId);
if (productDb == null)
{
return NotFound();
}
List<SelectListItem> selectedItems = productVM.Products.Where(p => productVM.ProductIDs.Contains(int.Parse(p.Value))).ToList();
string tekst = "";
foreach (var item in selectedItems)
{
tekst = tekst + item.Value.ToString() + ",";
}
productDb.BradIds = tekst;
productDb.Name = productVM.Name;
productDb.Price = productVM.Price;
productDb.Description = productVM.Description;
productDb.Category = productVM.Category;
ViewBag.Message4 = productVM.Name + " " + productVM.Category + " " + productVM.Description;
ViewBag.Message3 = tekst; //ok
ViewBag.Message = selectedItems.Count.ToString(); //ok
_context.SaveChanges(); //!!!!!!
}
return View(productVM);
}
Edit.cshtml:
@model ProductViewModel
<!DOCTYPE html>
<html>
<head>
<title>Aplikacja</title>
<meta charset="utf-8">
<link rel="stylesheet" href="~/dist/allstyles.css" />
</head>
<body>
<form asp-action="Index" method="post">
<input type="hidden" asp-for="ProductID" />
<div class="form-group">
<label asp-for="Name">Name</label>
<input asp-for="Name" class="form-control" />
</div>
<div class="form-group">
<label asp-for="Category">Category</label>
<input asp-for="Category" class="form-control" />
</div>
<div class="form-group">
<label asp-for="Description">Description</label>
<input asp-for="Description" class="form-control" />
</div>
<div class="form-group">
<label asp-for="Price">Price</label>
<input asp-for="Price" class="form-control" />
</div>
<div class="form-group">
<label asp-for="Products">Produkty</label>
<select asp-for="ProductIDs" class="form-control" asp-items="@Model.Products"></select>
</div>
<div class="text-center">
<button class="btn btn-primary" type="submit">Save</button>
<a asp-action="Index" class="btn btn-secondary">Cancel</a>
</div>
</form>
@ViewBag.Message
@ViewBag.Message2
@ViewBag.Message3
@ViewBag.Message4
</body>
</html>
ProductViewModel.cs:
public class ProductViewModel
{
public int ProductID { get; set; }
public string Name { get; set; }
public string Description { get; set; }
public decimal Price { get; set; }
public string Category { get; set; }
//dropdown
public IEnumerable<SelectListItem> Products { get; set; }
public int[] ProductIDs { get; set; }
}