亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

為什么使用 List<> 時相關表值在 HttpContext.Session.Get

為什么使用 List<> 時相關表值在 HttpContext.Session.Get

C#
汪汪一只貓 2023-08-13 16:22:00
我正在開發一個購物車(使用 MVC Asp.Net Core 2.2 和 EF)。有3個表(模型類):產品;尺寸(與產品表相關);TipoMassa(與 Produto 表相關)。在 ProductController 類中,我創建了一個存儲在 Session 中的列表,以便在 CartController 類中獲取此列表。但是,當我嘗試在 CartController 類中獲取該列表時,相關表(Tamanho 和 TipoMassa)中的值為空。該列表僅包含 Produto 表值。我該如何修復它?控制器類產品public ActionResult AddToCart(IFormCollection collection){    string Nome = collection["Nome"];    byte IdTamanho = Convert.ToByte(collection["IdTamanho"]);    byte IdTipoMassa = Convert.ToByte(collection["IdTipoMassa"]);    var produtoContext = _context.Produto            .Include(c => c.IdCategoriaNavigation)            .Include(c => c.IdTamanhoNavigation)            .Include(c => c.IdTipoMassaNavigation)            .FirstOrDefault(p => p.Nome == Nome && p.IdTamanho == IdTamanho        && p.IdTipoMassa == IdTipoMassa);    if (produtoContext == null)    {        return NotFound();    }    // Add itens na Sesssion    List<Produto> itens = new List<Produto>();    itens = HttpContext.Session.Get<List<Produto>>("itens");    if (itens == null)    {        itens = new List<Produto>();    }    itens.Add(produtoContext);    HttpContext.Session.Set("itens", itens);    TempData["save"] = "Adicionado com sucesso";    return RedirectToAction(nameof(Index), "Produto");}工作正常!但在 [CartController] IdCategoriaNavigation、IdTamanhoNavigation 和 IdTipoMassaNavigation 為空。代碼如下。購物車控制器類public IActionResult Index(){    List<Produto> itens = HttpContext.Session.Get<List<Produto>>            ("itens");    if (itens == null)    {        itens  = new List<Produto>();    }    return View(itens.ToList());}當我嘗試在視圖中顯示值時,相關表值(IdCategoriaNavigation、IdTamanhoNavigation 和 IdTipoMassaNavigation)為空。代碼如下。產品型號類別public partial class Produto{    public Produto()    {        Cardapio = new HashSet<Cardapio>();        ItensPedido = new HashSet<ItensPedido>();        Promocao = new HashSet<Promocao>();    }
查看完整描述

2 回答

?
繁花如伊

TA貢獻2012條經驗 獲得超12個贊

除非我弄錯了,否則我相信問題就出在 lambda 函數上:

代替

@Html.DisplayFor(modelItem => item.IdTamanhoNavigation)
                              ^^^

您需要引用正確的輸入參數(modelItem):

@Html.DisplayFor(modelItem => modelItem.IdTamanhoNavigation)
                                 ^^^


查看完整回答
反對 回復 2023-08-13
?
慕標琳琳

TA貢獻1830條經驗 獲得超9個贊

我忘了說我一直在使用 JSon 將該列表序列化為會話。但我必須在 Produto Model 類的那些相關方法上使用 [JsonIgnore],如果沒有,當包含這些相關表值時,我會從 Newtonsoft.Jason 收到錯誤。

正如你在下面看到的

在 ShoppingCart 控制器類上

public ActionResult AddToCart(IFormCollection collection)

{

    ...


    var produtoContext = _context.Produto

        .Include(c => c.IdCategoriaNavigation)

         ^^^^

        .Include(c => c.IdTamanhoNavigation)

         ^^^^

        .Include(c => c.IdTipoMassaNavigation)

         ^^^^

       .FirstOrDefault(p => p.Nome == Nome && p.IdTamanho == IdTamanho 

    && p.IdTipoMassa == IdTipoMassa);


    ... 


    The produtoContex here, normally has all the values from the related tables.

        {PianoPizza.Models.Categoria} 

        {PianoPizza.Models.Tamanho}

        {PianoPizza.Models.TipoMassa}


        But when I set the List on Session I got the Json error.     


    HttpContext.Session.Set("itens", itens);

                        ^^^^

    ...

 }

JsonSerializationException:檢測到類型為“Pianino.Models.Produto”的自引用循環。路徑“[0].IdCategoriaNavigation.Produto”。Newtonsoft.Json.Serialization.JsonSerializerInternalWriter.CheckForCircularReference(JsonWriter writer、對象值、JsonProperty 屬性、JsonContract 合約、JsonContainerContract 容器合約、JsonProperty 容器屬性)


即使評論第一個包括,我對 IdTamanhoNavigation 和 IdTipoMassaNavigation 也有相同的看法。


因此,使用如下所示的 [JsonIgnore],我修復了該錯誤。另一方面,當我從 ShoppingCart Controller 類上的會話獲取列表時,這些值變為 null。


關于產品型號類

 [JsonIgnore]

 public virtual Categoria IdCategoriaNavigation { get; set; }

 [JsonIgnore]

 public virtual Tamanho IdTamanhoNavigation { get; set; }

 [JsonIgnore]

 public virtual TipoMassa IdTipoMassaNavigation { get; set; }

在實用程序類上

public static class SessionExtensions

{


    public static void Set<T>(this ISession session, string key, T value)

    {

        session.SetString(key, JsonConvert.SerializeObject(value));

    }


    public static T Get<T>(this ISession session, string key)

    {

        var value = session.GetString(key);


        return value == null ? default(T) :

            JsonConvert.DeserializeObject<T>(value);

    }

}


查看完整回答
反對 回復 2023-08-13
  • 2 回答
  • 0 關注
  • 143 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號