【问题标题】:use JsonConvert to SerializeObject with varying parameters使用不同参数的 JsonConvert 到 SerializeObject
【发布时间】:2016-05-18 22:55:06
【问题描述】:

我将 Json 返回到 Ajax 以更改我页面上的一些 html。 c# 看起来像这样:

public JsonResult AddToCart(int id, int sizeid, int sizeVal, int catID)
{
    Cake C = db.Cakes.Find(id);


    List<Item> cart = new List<Item>();
    if (Session["cart"] == null)
    {
        cart.Add(new Item(C, 1, sizeid, sizeVal));
        Session["cart"] = cart;
    }

    else
    {
        cart = (List<Item>)Session["cart"];
        int index = isExisting(id, sizeid);
        if (index == -1)
            cart.Add(new Item(C, 1, sizeid, sizeVal));
        else
            cart[index].Quantity++;
        Session["cart"] = cart;
    }



    return Json(JsonConvert.SerializeObject(cart.Select(b => new { b.Cake.Image, b.Cake.Name, b.SizeVal, b.Quantity,  b.Cake.CakeDetails.Where(c => c.SizeID == b.Size).FirstOrDefault().Price, b.Cake.CakeID, b.Size }),
    Formatting.Indented,
    new JsonSerializerSettings { }), JsonRequestBehavior.AllowGet);

}

我有两类蛋糕,即纸杯蛋糕和蛋糕。蛋糕有两种尺寸和两种价格,而纸杯蛋糕没有尺寸。

当我在蛋糕上运行这个方法时,它运行良好,但是当我在纸杯蛋糕上运行它时,它给了我这个错误:

System.NullReferenceException

这是因为纸杯蛋糕没有上面代码中所写的b.Sizec.SizeID

有没有办法在cart.Select(b =&gt; new { ... }) 方法中允许空值? 或者我可以在cart.Select(b =&gt; new { ... })中放一个if语句或其他东西

我想使用相同的 AddToCart 方法返回蛋糕和纸杯蛋糕。我该怎么做?

【问题讨论】:

    标签: c# json ajax serialization parameters


    【解决方案1】:

    使用

    cart.FirstOrDefault(...);
    

    而不是Select()

    它也可以返回 null,所以在继续之前执行 null 检查。

    【讨论】:

    • 如果写 FirstOrDefault 而不是 Select 我收到错误消息:“无法隐式转换类型'' to 'bool'”和“无法将 lambda 表达式转换为预期的委托类型,因为块中的某些返回类型不能隐式转换为委托返回类型”
    【解决方案2】:
    b.Cake.CakeDetails.Where(c => c.SizeID == b.Size).FirstOrDefault()
    

    有可能将上述表达式的结果设为 null,然后将 .Price 设为 null 将导致您提到的异常。

    为避免这种情况,请在使用FirstOrDefault() 之前使用Select(p=&gt; p.Price)

    你应该使用:

    return Json(JsonConvert.SerializeObject(cart.Select(b => new { b.Cake.Image, b.Cake.Name, b.SizeVal, b.Quantity,  Price = b.Cake.CakeDetails.Where(c => c.SizeID == b.Size).Select(p=> p.Price).FirstOrDefault(), b.Cake.CakeID, b.Size }),
    Formatting.Indented,
    new JsonSerializerSettings { }), JsonRequestBehavior.AllowGet);
    

    【讨论】:

    • 当我使用它时,我会在 b.Cake.CakeDetails.Where(c => c.SizeID == b.Size).Select(p=> p.Price) 下看到一条红色波浪线。 FirstOrDefault() 和错误提示:无效的匿名类型成员声明器。必须使用成员分配、简单名称或成员访问来声明匿名类型成员。
    【解决方案3】:

    我想出了正确的答案

    我做了一个这样的新方法:

     public double GetPrice(IEnumerable<CakeDetail> CakeD, int? size)
        {
            if (size.HasValue)
            {
                var Check = CakeD.Where(d => d.SizeID == size.Value).FirstOrDefault();
                if (Check != null)
                {
                    return Check.Price;
                }
                else
                {
                    return 0;
                }
            }
            else
            {
                var Check = CakeD.FirstOrDefault();
                if (Check != null)
                {
                    return Check.Price;
                }
                else
                {
                    return 0;
                }
            }
        }
    

    然后我在 AddToCart 方法的返回中写了这个:

       return Json(JsonConvert.SerializeObject(cart.Select(b => new {
       Price = GetPrice(b.Cake.CakeDetails, b.Size)
       }),
       Formatting.Indented,
       new JsonSerializerSettings { }), JsonRequestBehavior.AllowGet);
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-09-30
      • 2015-12-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多