我有一个项目,使用数据库在用户之间进行在线商店(发布产品,购买等)。在这个项目中,我有一个名为“ShoppingCart”的视图:
@model IEnumerable<MyFirstProject.Models.Product>
@{
ViewBag.Title = "ShoppingCart";
Layout = "~/Views/Shared/_Layout.cshtml";
}
<h2>Your Shopping Cart</h2>
@if (Model == null)
{
<div style="float:left">Your cart is empty.</div>
<div>
Total payment: 0
</div>
}
else
{
decimal tPrice = 0;
<div>
<table style="float:left">
@foreach (var product in Model)
{
tPrice = tPrice + product.Price;
{ Html.RenderPartial("ProductLine", product);}
}
</table>
</div>
<div>
Total payment: @tPrice
</div>
}
它会收到用户决定购买并显示的产品列表(不是重要部分)。我需要添加一个按钮,将列表发送到“ShoppingController”中的操作结果:
[HttpPost]
public ActionResult ShoppingCart(List<Product> bought)
{
if (ModelState.IsValid)
{
foreach (var listP in bought.ToList())
{
foreach (var databaseP in db.Products.ToList())
{
if (listP.ProductID == databaseP.ProductID)
{
databaseP.State = 1;
db.SaveChanges();
break;
}
}
}
return RedirectToAction("Index");
}
else
{
return View(bought);
}
}
“State”表示产品是否被购买(0 =未购买,1 =购买),db是数据库
答案 0 :(得分:0)
如果您不想将视图中的任何数据发布到操作方法,则应将这些数据保存在表单元素中并将其保留在表单中。由于您要发布项目集合,因此您可以使用编辑器模板。
让我们从创建视图模型开始。
public class ShoppingCartViewModel
{
public decimal TotalPrice { set; get; }
public List<Product> CartItems { set; get; }
}
public class Product
{
public int Id { set; get; }
public string Name { set; get; }
}
现在,在您的GET操作中,您将创建ShoppingCartViewModel
的对象,加载CartItems
属性并发送到视图。
public ActionResult Index()
{
var cart = new ShoppingCartViewModel
{
CartItems = new List<Product>
{
new Product { Id = 1, Name = "Iphone" },
new Product { Id = 3, Name = "MacBookPro" }
},
TotalPrice = 3234.95
};
return View(cart);
}
现在我将创建一个EditorTemplate。为此,请转到~/Views/YourControllerName
文件夹,然后创建名为EditorTemplates
的目录,并添加名称为Product.cshtml
的视图
该文件的名称应与该类型的名称相匹配。
打开此新视图并添加以下代码。
@model YourNamespace.Product
<div>
<h4>@Model.Name</h4>
@Html.HiddenFor(s=>s.Id)
</div>
您可以随意保留显示。但重要的是,我们需要为productId保留一个表单字段。我们将它保存在一个隐蔽的领域。
现在让我们回到主视图。我们需要将此视图强烈输入到ShoppingCartViewModel
。我们将在此视图中使用EditorFor
html辅助方法来调用我们的编辑器模板
@model ReplaceYourNamespaceHere.ShoppingCartViewModel
@using (Html.BeginForm())
{
@Html.EditorFor(x => x.CartItems)
<p>Total : @Model.TotalPrice</p>
<input type="submit" />
}
在你的HttpPost动作方法中,我们将有一个ShoppingCartViewModel
类型的游侠。提交表单时,MVC Model binder会将发布的表单值映射到ShoppingCartViewModel
的对象。
[HttpPost]
public ActionResult Index(ShoppingCartViewModel model)
{
foreach (var item in model.CartItems)
{
var productId = item.Id;
// to do : Use productId and do something
}
return RedirectToAction("OrderSucessful");
}
您可以遍历CartItems
集合并获取产品的ID并执行任何操作。
如果您不允许用户在此页面中编辑项目(使用复选框),请查看this answer。它基本相同,但您向Product类添加一个布尔属性,并使用它来渲染复选框。