Member 13232873 Ответов: 1

Хранение и извлечение объекта списка в сеансе


Пожалуйста, кто-нибудь может помочь мне добавить и получить данные списка в сеанс в ядре MVC

public ActionResult OrderNow(int id)
     {
         if (HttpContext.Session.GetString("AnansiCart") ==null)
         {
             List<Item> cart = new List<Item>();
             cart.Add(new Item(_productResipory.GetByID(id),1));

           <<Need to add "cart to a session">>

         }
         else
         {

         }

         return View("Cart");
     }


Что я уже пробовал:

public ActionResult OrderNow(int id)
{
    if (HttpContext.Session.GetString("AnansiCart") ==null)
    {
        List<Item> cart = new List<Item>();
        cart.Add(new Item(_productResipory.GetByID(id),1));


        HttpContext.Session.SetObjectAsJson("AnansiCart", cart);
    }
    else
    {

    }

    return View("Cart");
}

Но не знаю, как получить его на моей веб-странице

1 Ответов

Рейтинг:
1

Richard Deeming

Состояние сеанса в ASP.NET ядро существенно отличается от предыдущих версий ASP.NET, но это не слишком сложно для работы:
Использование сеансов и HttpContext в ASP.NET ядро и ядро MVC[^]

// Get the cart from the session; if it doesn't exist, create a new one:
List<Item> cart = HttpContext.Session.GetObjectFromJson<List<Item>>("AnansiCart") ?? new List<Item>();

// Modify the cart:
cart.Add(...);

// Store the modified cart:
HttpContext.Session.SetObjectAsJson("AnansiCart", cart);

NB: В отличие от предыдущих версий ASP.NET, обновления сложных объектов не сохраняются автоматически. Вам нужно будет позвонить в SetObjectAsJson метод расширения после того, как вы закончите вносить свои изменения.

Для простоты, вы, возможно, захотите, чтобы объявить фасада, чтобы инкапсулировать доступ к сессии:
public static class CartExtensions
{
    private const string CartSessionKey = "AnansiCart";
    
    public static List<Item> GetCart(this ISession session)
    {
        return session.GetObjectFromJson<List<Item>>(CartSessionKey) ?? new List<Item>();
    }
    
    public static void SaveCart(this ISession session, List<Item> cart)
    {
        session.SetObjectAsJson(CartSessionKey, cart);
    }
}

Таким образом, ключ хранится только один раз, избегая возможности опечаток, и вам не нужно постоянно повторять один и тот же код:
List<Item> cart = HttpContext.Session.GetCart();

cart.Add(...);

HttpContext.Session.SaveCart(cart);