将对象从视图传递到控制器

时间:2018-01-26 18:28:20

标签: asp.net-mvc

我已经查了很多类似的帖子,似乎找不到我错误的原因。

我试图将对象类型“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)停止。

2 个答案:

答案 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);
    }