Проблема с 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 не может знать, что он выполнен успешно. Есть ли у вас условия гонки (радости асинхронного программирования)?

Например:

  1. JQuery вызывает AddToCart, который начинает обработку.
  2. Метод void, jQuery не ждет "ответа" (его не будет), поэтому переходите к методу Success.
  3. jQuery вызывает ShowCart (или аналогичный), который возвращает не обновленную корзину.
  4. AddToCart завершает работу, сохраняя обновленную версию корзины в базе данных.
  5. При следующем запуске 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);
    }
Другие вопросы по тегам