为了账号安全,请及时绑定邮箱和手机立即绑定

为什么使用 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 关注
  • 66 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信