如何在“点击事件”中反序列化会话数据,该会话数据是从另一个函数接收的?

问题描述 投票:0回答:1
   public partial class PaymentForm : System.Web.UI.Page
{ 

public class CartItem
 {
     public string name { get; set; }
     public decimal price { get; set; }
     public int quantity { get; set; }
 }

 public class CartDataRequest
 {
     public List<CartItem> cart { get; set; }
     public decimal finalAmount { get; set; }
 }

 
 [System.Web.Services.WebMethod]
 public static void StoreCartData(string cartData1)
 {
     try
     {
         CartDataRequest cartData = JsonConvert.DeserializeObject<CartDataRequest>(cartData1);
         List<CartItem> cartItems = cartData.cart;
         decimal finalAmount = Convert.ToDecimal(cartData.finalAmount);

        HttpContext.Current.Session["CartData"] = JsonConvert.SerializeObject(cartData1);

         System.Diagnostics.Debug.WriteLine("Cart data stored successfully in ASP session.");
         
         System.Diagnostics.Debug.WriteLine("CartData contents: " + HttpContext.Current.Session["CartData"]);     
     }
     catch (Exception ex)
     {
         System.Diagnostics.Debug.WriteLine("Error storing cart data: " + ex.Message);
         throw;
     }
 }

} 

我使用ajax和Web方法将数据从客户端传递到服务器端页面。我可以在第一个函数中反序列化和序列化数据。然后将其传递给单击事件。

 protected void btnSubmitOrder_Click(object sender, EventArgs e)
 {
     try
     {
        // Retrieve cart data from session
         string storedCartData = (string)Session["CartData"];
         System.Diagnostics.Debug.WriteLine("Stored Cart Data: " + storedCartData);

         if (!string.IsNullOrEmpty(storedCartData))
         {
             CartDataRequest cartDataRequest = new CartDataRequest();
             // Deserialize the JSON string into CartDataRequest object
             CartDataRequest cartData = JsonConvert.DeserializeObject<CartDataRequest> (storedCartData);  /* at this point the deserialization failed.jumps to error message */
             System.Diagnostics.Debug.WriteLine("CartData new contents:" + cartData);
        }
        else
        { System.Diagnostics.Debug.WriteLine("Stored Cart Data is empty "); 
         }
     catch (Exception ex)
{
    System.Diagnostics.Debug.WriteLine("Error processing cart data: " + ex.Message);
    string script = "alert('An error occurred during the process')";
    ScriptManager.RegisterStartupScript(this, GetType(), "ServerControlScript", script, true);
}

在本节中,我无法反序列化收到的会话。它跳转到捕获异常处的错误消息。调试面板上的消息是“Newtonsoft.Json.dll 中的‘Newtonsoft.Json.JsonSerializationException’”。

我需要一些有关如何解决该问题并访问会话内数据的指导。然后只有我可以访问数据并将其存储到 SQL 中

TIA。

c# asp.net session serialization deserialization
1个回答
0
投票

您可以将反序列化的对象推入会话中。无需再次序列化。

此外,您还没有将您的 Web 方法标记为启用了会话。

所以,你需要这个:

[System.Web.Services.WebMethod(enableSession:true)]

如果没有上述内容,那么保存到会话中的代码将无法工作。

因此,你可以这样做:

HttpContext.Current.Session["CartData"] = cartData1;

现在,稍后在代码中,您可以使用以下方法获取对象:

  cartData1 = (List<CartItem>)session["cartData"];

因此,将对象放入会话中,然后您可以自由地取出该对象,并且此时不需要序列化。

因此,将对象存储在会话中,而不是 Json 字符串。

如果您在某个时间点将对象发送回客户端,则只需再次序列化该对象即可。

因此,对于在代码后面的该对象的一般使用,然后保存该对象应该可以正常工作。

© www.soinside.com 2019 - 2024. All rights reserved.