Проблема с View - не обновляется после обновления БД
Я работаю с небольшим проектом ASP.NET MVC - интернет-магазином.
У меня есть метод addToCart, который добавляет выбранный продукт в корзину - он обновляет таблицу корзины в моей базе данных и показывает представление корзины с ее содержимым. Но у меня есть проблемы. Пока БД корректно обновляет вид, нет. Я вижу, что количество товара в моей базе данных увеличивается правильно, но количество не меняется. Я должен прекратить отладку моего приложения в визуальных студиях и перезапустить его - тогда мое представление показывает правильные данные. Что может быть не так?
Я использую LINQ to Entity. метод Добавить из корзины репозиторий:
public void Add(int product, int quantity, string user)
{
Cart cart = null;
cart = (from c in de.Cart
where (c.userName == "testUser" && c.productId == product)
select c).First();
// query is searching for existing product of testUser and id specified in parameter in cart and get it
cart.quantity += 1; //increment quantity
de.SaveChanges(); // save entity
}
Метод AddToCart из контроллера:
public void AddToCart(int pid, int quant, string usr)
{
_cartRep.Add(pid,quant,usr);
}
и метод, который возвращает корзину View:
public ActionResult Cart()
{
IEnumerable<CartInfo> model = _cartRep.GetTrans();
return View(model);
}
Вот реализация GetTrans():
public IEnumerable<CartInfo> GetTrans()
{
using (DBEntities de = new DBEntities())
{
return (from c in de.Cart
where (c.userName == "testUser")
select new CartInfo
{
Id = c.id,
ProductId = c.productId,
Quntity = c.quantity,
Realized = c.realized,
UserName = c.userName,
Value = c.value,
Products = (from p in de.Product
where (p.id == c.productId)
select new ProductInfo
{
Category = p.Category,
Desc = p.Description,
Id = p.id,
Image = p.Image,
Name = p.Name,
Quntity = p.Quantity,
Price = p.Price
})
}).ToList();
}
}
Как вы увидели, у меня есть имя пользователя в жестком коде. Я сделал это только для тестирования. Если бы я знал, что это работает, я улучшу код. Спасибо за хороший совет с.FristOrDefault()
3 ответа
Html-помощники получают данные из состояния модели, а не из модели, если вы возвращаете то же представление после публикации формы. чтобы получить обновленные данные в представлении, используйте шаблон get перенаправления post или ModelState.Clear()
Возвращаете ли вы обновленную модель корзины в просмотр или оригинальную корзину без обновлений?
Отвечая на комментарий
"После успеха я использую jquery, чтобы показать корзину". Как узнать, что вызов AddToCart завершился успешно? Если это пустой метод, то, за исключением ошибок вызова (404/500), вызов jQuery не может знать, что он выполнен успешно. Есть ли у вас условия гонки (радости асинхронного программирования)?
Например:
- JQuery вызывает AddToCart, который начинает обработку.
- Метод void, jQuery не ждет "ответа" (его не будет), поэтому переходите к методу Success.
- jQuery вызывает ShowCart (или аналогичный), который возвращает не обновленную корзину.
- AddToCart завершает работу, сохраняя обновленную версию корзины в базе данных.
- При следующем запуске ShowCart возвращает обновленную корзину.
Я использую LINQ to Entity. метод Добавить из корзины репозиторий:
public void Add(int product, int quantity, string user)
{
Cart cart = null;
cart = (from c in de.Cart
where (c.userName == "testUser" && c.productId == product)
select c).First();
// query is searching for existing product of testUser and id specified in parameter in cart and get it
cart.quantity += 1; //increment quantity
de.SaveChanges(); // save entity
}
Метод AddToCart из контроллера:
public void AddToCart(int pid, int quant, string usr)
{
_cartRep.Add(pid,quant,usr);
}
и метод, который возвращает корзину View:
public ActionResult Cart()
{
IEnumerable<CartInfo> model = _cartRep.GetTrans();
return View(model);
}