lambda表达式问题

时间:2016-09-29 07:10:51

标签: asp.net-mvc lambda

我的问题是,当我点击actionlink时,视图会向控制器发送特定ID(例如ProductID = 6),但我的控制器会抓取所有数据给我,而不是特定的ID数据。

我认为问题是控制器上的lambda表达式,它会抓取所有数据给我。

这些是我的模特:

    public class ShoppingCart
    {
        public List<ShoppingCartItemModel> items = new List<ShoppingCartItemModel>();

        public IEnumerable<ShoppingCartItemModel> Items 
        {
            get { return items; }
        }
    }


    public class ShoppingCartItemModel
    {
        public Product Product
        {
            get;
            set;
        }

        public int Quantity { get; set; }
    }

控制器:

        [HttpGet]
        public ActionResult EditFromCart(int ProductID)
        {

            ShoppingCart cart = GetCart();
            cart.items.Where(r => r.Product.ProductID == ProductID)
                      .Select(r => new  ShoppingCartItemModel
                                        {
                                            Product = r.Product,
                                            Quantity = r.Quantity
                                        });

            return View(cart);

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


        private ShoppingCart GetCart()
        {
            ShoppingCart cart = (ShoppingCart)Session["Cart"];

            //如果現有購物車中已經沒有任何內容
            if (cart == null)
            {
                //產生新購物車物件
                cart = new ShoppingCart();

                //用session保存此購物車物件
                Session["Cart"] = cart;
            }

            //如果現有購物車中已經有內容,就傳回 view 顯示
            return cart;
        }

查看

@model ShoppingCart

@{
    ViewBag.Title = "購物車內容";
}

<h2>Index</h2>

<table class="table">
    <thead>
        <tr>
            <th>
                Quantity
            </th>
            <th>
                Item
            </th>
            <th class="text-right">
                Price
            </th>
            <th class="text-right">
                Subtotal
            </th>
        </tr>
    </thead>
    <tbody>
        @foreach (var item in Model.items)
        {
            <tr>
                <td class="text-center">
                    @item.Quantity
                </td>
                <td class="text-center">
                    @item.Product.ProductName
                </td>
                <td class="text-center">
                    @item.Product.Price.ToString("c")
                </td>
                <td class="text-center">
                    @( (item.Quantity * item.Product.Price).ToString("c"))
                </td>
                <td>
                    @using (Html.BeginForm("RemoveFromCart", "ShoppingCart"))
                    {
                        @Html.Hidden("ProductId", item.Product.ProductID)
                        @*@Html.HiddenFor(x => x.ReturnUrl)*@
                        <input class="btn btn-warning" type="submit" value="Remove">
                    }
                </td>
                <td>
                    @using (Html.BeginForm("EditFromCart", "ShoppingCart", FormMethod.Get))
                    {
                        @Html.Hidden("ProductId", item.Product.ProductID)
                        <input class="btn btn-warning" type="submit" value="Edit">
                    }
                </td>

            </tr>
        }
    </tbody>

</table>

3 个答案:

答案 0 :(得分:2)

关键问题是此代码没有返回LINQ查询的结果,因为您没有为结果分配变量:

cart.items.Where(r => r.Product.ProductID == ProductID)
                      .Select(r => new  ShoppingCartItemModel
                                        {
                                            Product = r.Product,
                                            Quantity = r.Quantity
                                        });

我强烈建议你专门创建一个viewmodel来显示购物车项目。

public class CartItemsViewModel
{
    public List<ShoppingCartItemModel> Items { get; set; }
}

[HttpGet]
public ActionResult EditFromCart(int ProductID)
{

    ShoppingCart cart = GetCart();

    var viewModel = new CartItemsViewModel();

    viewModel.Items.AddRange(cart.items.Where(r => r.Product.ProductID == ProductID)
                .Select(r => new  ShoppingCartItemModel
                                {
                                    Product = r.Product,
                                    Quantity = r.Quantity
                                }));

    return View(viewModel);
}

在我的示例中,我使用.AddRange()方法针对购物车项目获取LINQ调用的结果,并将它们存储在viewmodel的Items属性中。

答案 1 :(得分:0)

您需要保存变量中cart.Items上的linq查询的返回值,并将其传递给View方法。 目前,查询结果丢失,整个购物车传递给View方法。

答案 2 :(得分:0)

您必须像这样将过滤后的值分配给购物车。

cart.item = cart.items.Where(r => r.Product.ProductID == ProductID)
                      .Select(r => new  ShoppingCartItemModel
                                        {
                                            Product = r.Product,
                                            Quantity = r.Quantity
                                        }).ToList();

根据您的情况使用ToList();FirstOrDefault()