2016-11-11 13 views
0

私はショッピングカートを作成しており、カートを追跡するために製品ビューモデルのリストを含むセッションがあります。リスト内の特定のビューモデルを編集して削除する

これは、カートに追加するためのアクションメソッドです:

public ActionResult AddToCart(string id) 
     { 
      List<CartVM> cartVMList = new List<CartVM>(); 
      CartVM cartVM = new CartVM(); 

      int productId = Int32.Parse(id); 

      Db db = new Db(); 

      var result = db.Products.FirstOrDefault(x => x.Id == productId); 
      decimal price = result.Price; 

      cartVM.ProductId = productId; 
      cartVM.Quantity = 1; 
      cartVM.Price = price; 

      if (Session["cart"] != null) 
      { 
       cartVMList = (List<CartVM>)Session["cart"]; 
       cartVMList.Add(cartVM); 
      } 
      else 
      { 
       cartVMList.Add(cartVM); 
      } 

      Session["cart"] = cartVMList; 

      //return Content(id); 
      return RedirectToAction("Index", "ShoppingCart"); 
     } 

新製品を追加するときそれはとても例えば、動作します5つの新しい製品を追加するとセッションには5つの製品のリストが含まれますが、たとえばProductIdに基づいてリストから特定のビューモデルを編集して削除するにはどうすればよいですか?

答えて

0

私はそれをテストしていませんが、次のように動作するはずです。カートに追加するときと同じように、カートのリストを取得するだけです。新しい項目を追加する代わりに、リスト内のオブジェクトを編集するか、リストから削除するだけです。

技術的には、セッションが何か特別なことをしない限り、リストは参照型なので、セッションから取得した場合はセッションを再保存する必要はありません。

public ActionResult EditCartItem(string id, int quantity, decimal price) 
{ 
    if (Session["cart"] != null) 
    { 
     var cartVMList = (List<CartVM>) Session["cart"]; 
     var itemToEdit = cartVMList.FirstOrDefault(cartVM => cartVM.Id == id); 
     if(itemToEdit == null) 
      return this.HttpNotFound(); 
     itemToEdit.Quantity = quantity; 
     itemToEdit.Price = price;   
    } 
} 
public ActionResult RemoveFromCart(string id) 
{ 
    if (Session["cart"] != null) 
    { 
     var cartVMList = (List<CartVM>) Session["cart"]; 
     var itemToRemove = cartVMList.FirstOrDefault(cartVM => cartVM.Id == id); 
     if(itemToRemove == null) 
      return this.HttpNotFound(); 
     cartVMList.Remove(itemToRemove); 
    } 
} 
+0

ありがとうございます、私のコードでこれを少しテストして、私が探しているものと思われます。しかし、FirstOrDefaultはリストと一緒に使用するとどうなりますか?私はそれがEFに存在することを知っていますが、この文脈では何ですか? – frc

+0

'FirstOrDefault'はLinqベースの関数で、' IEnumerable'インタフェースで公開されています。 EFはLinq式をSQL(通常)に変換します。しかし、メモリ内のオブジェクトに対してLinqを使用することができます。この特定の場合、FirstOrDefaultは、 'id'と一致する最初の' cartVM'(リスト内のオブジェクト)を返します。一致しない場合はnullを返します。最初の一致が見つかると、Linq反復はループを終了します( 'Single' /' SingleOrDefault'とは対照的に)。このサイトは正常終了します:http://www.technicaloverload.com/linq-single-vs-singleordefault-vs-first-vs-firstordefault/ –

関連する問題