2016-05-12 319 views
0

我將Json返回到Ajax以更改我的頁面上的某些html。 c#看起來像這樣:使用JsonConvert以SerializeObject變參數

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 => new { ... })方法中允許null? 或者我可以把一個if語句或東西在cart.Select(b => new { ... })

我想使用相同的AddToCart方法返回蛋糕和紙杯蛋糕。我怎樣才能做到這一點?

回答

0

我想通了正確的答案

我做了一個新的方法是這樣的:

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); 
0

使用

cart.FirstOrDefault(...); 

,而不是Select();

它也可以返回null,因此在繼續之前執行空檢查。

+0

如果寫第一個OrDefault而不是Select我得到的錯誤說:「不能隱式轉換類型'<匿名類型:字符串圖像,字符串名稱,int? SizeVal,int Quantity,double Price,int CakeID,int? Size>'到'bool'「 和 」無法將lambda表達式轉換爲預期的委託類型,因爲塊中的某些返回類型不能隱式轉換爲委託返回類型「 – 6134548

0
b.Cake.CakeDetails.Where(c => c.SizeID == b.Size).FirstOrDefault() 

機會是那裏得到上述表達式的結果作爲null然後.Price上null會導致你所提到的例外。

爲避免這種情況,請在服用FirstOrDefault()之前使用Select(p=> 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); 
+0

當我使用該函數時,出現紅色波浪線(c => c.SizeID == b.Size).Select(p => p.Price).FirstOrDefault()和錯誤提示: 無效的匿名類型成員聲明。匿名類型成員必須聲明爲成員分配,簡單名稱或成員訪問 – 6134548

+0

請參閱我的更新回答。 –