我的问题是,当我点击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>
答案 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()