【问题标题】:How to call a list of objects from a session?如何从会话中调用对象列表?
【发布时间】:2023-01-09 17:45:26
【问题描述】:

我正在创建这样的发票: 对于登录用户,我将发票和发票单位保存到数据库(一张发票有多个发票单位),对于未登录的用户,我试图将数据保存到会话中

    [HttpPost]
    public ActionResult Create(Invoice invoice)
    {
        var userId = User.Claims.FirstOrDefault(c => c.Type == "UserId")?.Value;
        if (userId is not null)
        {
            invoice.UserId = Guid.Parse(userId.ToString());
            DateTime dateTime = DateTime.Now;
            invoice.DateCreated = dateTime;
            foreach (var invoiceUnit in invoice.InvoiceUnits)
            {
                db.InvoiceUnits.Add(invoiceUnit);
            }
            db.Add(invoice);
            db.SaveChanges();
            return RedirectToAction("Index");
        }
        else
        {
            invoice.Id = Guid.NewGuid();
            var invoicesFromSession = GetInvoicesFromSession();
            var invoiceUnitsFromSession = GetInvoiceUnitsFromSession();

            DateTime dateTime = DateTime.Now;
            invoice.DateCreated = dateTime;

            if (invoice is not null)
            {
                invoicesFromSession.Add(invoice);

                HttpContext.Session.SetString("invoice", JsonSerializer.Serialize(invoicesFromSession));

                foreach(var invoiceUnit in invoice.InvoiceUnits)
                {
                    invoiceUnit.Id = new Guid();
                    invoiceUnit.InvoiceId = invoice.Id;
                    HttpContext.Session.SetString("invoiceUnit", JsonSerializer.Serialize(invoiceUnitsFromSession));
                    invoiceUnitsFromSession.Add(invoiceUnit);
                }

            }

            return RedirectToAction("Index");
        }

    }

我从这样的会话中获取发票单位:

    private List<InvoiceUnit> GetInvoiceUnitsFromSession()
    {
        HttpContext.Session.LoadAsync();
        var sessionString = HttpContext.Session.GetString("invoiceUnit");
        if (sessionString is not null)
        {
            return JsonSerializer.Deserialize<List<InvoiceUnit>>(sessionString);
        }

        return Enumerable.Empty<InvoiceUnit>().ToList();
    }

然后我试图调用编辑控制器中的函数

            var sessionInvoices = GetInvoicesFromSession();
            var sessionInvoiceUnits = GetInvoiceUnitsFromSession();
            var invoiceFromDbSession = sessionInvoices.FirstOrDefault(i => i.Id == id);
            List<InvoiceUnit> invoiceUnitsForInvoiceSession = new List<InvoiceUnit>();

            foreach (var invoiceUnit in sessionInvoiceUnits)
            {
                if (invoiceUnit.InvoiceId == id)
                {
                    invoiceUnitsForInvoiceSession.Add(invoiceUnit);
                }
            }
            GenericModel sessionData = new GenericModel(invoiceUnitsForInvoiceSession, invoiceFromDbSession);
            return View(sessionData);

由于某种原因,当我在编辑控制器中调用 GetInvoiceUnitsFromSession(); 以检索特定发票的所需发票单元时,我只收到每张发票的一个发票单元(我输入的第一个发票)。当我在创建函数中调试 invoiceUnitsFromSession 变量时,单位数量正好适合特定发票,因此我认为我尝试检索会话的方式一定存在问题。知道要进行哪些更改才能检索我收到的所有发票的所有发票单元,以便我可以在编辑控制器中获取它们吗?

【问题讨论】:

    标签: c# asp.net asp.net-mvc


    【解决方案1】:

    从会话中调用对象列表

    你想要下面的方式吗?

    像下面这样配置你的 SessionExtension:

    public static class SessionExtensions
    {
        public static void Set<T>(this ISession session, string key, T value)
        {
            session.SetString(key, JsonSerializer.Serialize(value));
        }
    
        public static T? Get<T>(this ISession session, string key)
        {
            var value = session.GetString(key);
            return value == null ? default : JsonSerializer.Deserialize<T>(value);
        }
    }
    

    然后使用如下方法:

    ////  your list object
    List<MyClass> classCollection = new List<MyClass>();
    
    //// To set value in session
    HttpContext.Session.Set<List<MyClass>>("someKey", classCollection);
    
    //// To Get Value from Session
    List<MyClass> classCollection = HttpContext.Session.Get<List<MyClass>>("someKey");
    

    阅读Set and get Session values了解更多。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-01-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-03-27
      • 2018-03-14
      • 2016-08-21
      相关资源
      最近更新 更多