2016-05-12 1 views
0

Ich gebe Json an Ajax zurück, um etwas HTML auf meiner Seite zu ändern. Die C# sieht so aus:Verwenden Sie JsonConvert zu SerializeObject mit variierenden Parametern

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

} 

Ich habe zwei Kategorien von Kuchen, die Cupcakes und Kuchen sind. Die Kuchen haben zwei Größen und zwei Preise für jede Größe, während die Cupcakes keine Größe haben.

Wenn ich laufen diese Methode auf einem Kuchen es funktioniert perfekt, aber wenn ich es auf einem kleinen Kuchen laufen sie geben mir diesen Fehler:

System.NullReferenceException

Das ist, weil die kleinen Kuchen haben keine b.Size oder eine c.SizeID als im obigen Code geschrieben.

Gibt es eine Möglichkeit, Null in der cart.Select(b => new { ... }) Methode zu ermöglichen? Oder kann ich eine if-Anweisung oder etwas in die cart.Select(b => new { ... })

Ich möchte die gleiche AddToCart-Methode zurück Kuchen und Cupcakes. Wie kann ich das machen?

Antwort

0

ich herausgefunden, die richtige Antwort

ich eine neue Methode wie folgt aus:

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; 
      } 
     } 
    } 

und dann habe ich dies in der AddToCart Methode Rückkehr schrieb :

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

Verwenden

cart.FirstOrDefault(...); 

statt Select();

Es kann auch null zurückgeben, also führen Sie einen Null-Check durch, bevor Sie fortfahren.

+0

Wenn zuerst schreiben OrDefault statt Select Ich erhalte Fehlermeldungen, die sagen: "Typ kann nicht implizit konvertiert werden" 'bis' bool '" und " Kann Lambda-Ausdruck nicht in den beabsichtigten Delegattyp konvertieren, da einige der Rückgabetypen im Block nicht implizit in den Delegate-Rückgabetyp konvertierbar sind " – 6134548

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

Die Chancen stehen gut es der obige Ausdruck Ergebnis als null zu bekommen und dann .Price auf null bewirkt, dass die Ausnahme, die Sie erwähnt haben. Um dies zu vermeiden, verwenden Sie Select(p=> p.Price) bevor Sie FirstOrDefault() nehmen.

sollten Sie verwenden:

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

Wenn ich das verwende, bekomme ich eine rote Linie unter b.Cake.CakeDetails.Where (c => c.SizeID == b.Size) .Wählen Sie (p => p.Price) .FirstOrDefault() und Fehler sagt: Ungültige anonyme Typ Mitglied Deklarator.Anonyme Typ Mitglieder müssen mit einer Mitgliederzuweisung, einem einfachen Namen oder einem Mitglied-Zugriff deklariert werden – 6134548

+0

Bitte sehen Sie meine aktualisierte Antwort. –