2016-05-12 5 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); 

} 

私はカップケーキとケーキの2種類のケーキを持っています。ケーキは、サイズごとに2つのサイズと2つの価格がありますが、カップケーキはサイズがありません。

私はそれが完璧に動作しますが、私はカップケーキの上にそれを実行すると、それは私に、このエラーを与えるケーキの上に、この方法を実行します。

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の代わりにエラーが表示されます: "暗黙的に型を変換できません '<匿名型:string Image、string Name、int? SizeVal、int量、倍精度価格、int CakeID、int? Size> '' to 'bool' " と "ブロックの戻り値の型の一部が代理返り値の型に暗黙的に変換できないため、ラムダ式を目的のデリゲートの型に変換できません " – 6134548

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

チャンスはヌルにnull、その後.Priceはあなたが言及した例外が発生しますと、上記の式の結果を得るためにあります。

これを避けるには、を取得する前に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

私の更新された回答をご覧ください。 –

関連する問題