我已经查了很多类似的帖子,似乎找不到我错误的原因。
我试图将对象类型“Product”从视图传递给控制器,然后检查此项的属性。
视图看起来像这样 -
<table width="100%" cellpadding="5" cellspacing="2" border="0" style="background-color: White;">
@foreach (var item in Model.products)
{
<tr>
<td>@item.ProductName</td>
<td>@item.Price</td>
<td>@item.Quantity</td>
<td><text><img src="@item.Image" width="250px" height="200px"></img></text></td>
<td>
@using (Html.BeginForm("Purchase", "Home", FormMethod.Post, new { Product = item}))
{
<input type="hidden" name="item" value="@item" />
<input type="submit" value="Purchase" onclick="return confirm('Purchase @item.ProductName ?')" />
}
</td>
</tr>
}
</table>
控制器 -
[HttpPost]
public ActionResult Purchase(Product item)
{
if (item.Quantity > 0)
{
ProductDAL dal = new ProductDAL();
foreach (Product obj in dal.Products)
{
if (obj.ProductID.Equals(item.ProductID))
{
obj.Quantity--;
}
}
dal.SaveChanges();
return View("PurchaseSuccess", item);
}
Session["check"] = item.ProductName;
return View("PurchaseFail");
}
由于提到的错误,程序在if(item.Quantity > 0)
停止。
答案 0 :(得分:0)
您正尝试在隐藏的表单字段中传递对象。那会是什么样的?
相反,请将产品模型所需的所有数据字段设置为表单字段,例如hiddenFor。然后,Controller将读取字段并将它们绑定到模型。
答案 1 :(得分:0)
就像我在评论中所说的,比尝试传递整个对象更好的方法就是使用产品ID。
<input type="hidden" name="productId" value="@item.ProductID" />
然后相应地修改控制器操作。如果可能,我建议在您的DAL上添加GetProductById()
方法。
[HttpPost]
public ActionResult Purchase([FromBody] int productId)
{
ProductDAL dal = new ProductDAL();
Product item = dal.GetProductById(productId)
if (item.Quantity == 0)
{
Session["check"] = item.ProductName;
return View("PurchaseFail");
}
item.Quantity--;
dal.SaveChanges();
return View("PurchaseSuccess", item);
}