控制器无法接收模型数据

时间:2016-09-30 07:16:46

标签: asp.net-mvc

您好我想抓取所有用户修改数据。

我的问题是为什么控制器无法从我的项目中的View接收模型数据。

请解释导致此错误的原因以及解决方法。

型号:

 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; }
    }

控制器

 [HttpPost]
        public RedirectToRouteResult EditFromCart(ShoppingCart MyModel)
        {
            ShoppingCart cart = GetCart();

            foreach (var CartItem in cart.items)
            {
                foreach (var ReceiveModelItem in MyModel.items)
                {
                    if (CartItem.Product.ProductID == ReceiveModelItem.Product.ProductID)
                    {
                        CartItem.Quantity = ReceiveModelItem.Quantity;
                    }
                }
            }

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

        }

查看

@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>
        @using (Html.BeginForm("EditFromCart", "ShoppingCart", FormMethod.Post))
        {
            foreach (var item in Model.items)
            {
                <tr>
                    <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 class="text-left">

                        @Html.EditorFor(model => item.Quantity, null, "UserInputQuantity")

                        @Html.Hidden("ProductId", item.Product.ProductID)
                    </td>

                </tr>
            }
            <tr>
                <td colspan="3">
                    <input class="btn btn-warning" type="submit" value="Edit">
                </td>
            </tr>
        }
    </tbody>
</table>

2 个答案:

答案 0 :(得分:2)

您必须为要绑定的复杂对象中的每个属性显式创建隐藏输入。 IEnumebles和绑定不能直接开箱即用 - 看起来MVC对IList&lt;&gt;有更好的基础支持。和数组,但你仍然需要枚举集合并为每个项目创建隐藏的输入。看看这个link。所以,理想情况下你的观点应该是:

@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>
        @using (Html.BeginForm("EditFromCart", "ShoppingCart", FormMethod.Post))
        {
            for (int i = 0; i < Model.items.Count(); ++i)
            {
                <tr>
                    <td class="text-center">
                        @Model.items[i].Product.ProductName

                    </td>
                    <td class="text-center">
                        @Model.items[i].Product.Price.ToString("c")

                    </td>
                    <td class="text-center">
                        @( (Model.items[i].Quantity * Model.items[i].Product.Price).ToString("c"))

                    </td>
                    <td class="text-left">

                        @Html.EditorFor(model => Model.items[i].Quantity)


                        @Html.HiddenFor(model => Model.items[i].Product.ProductID)
                        @Html.HiddenFor(model => Model.items[i].Product.ProductName)
                        @Html.HiddenFor(model => Model.items[i].Product.Price)

                    </td>

                </tr>
            }
            <tr>
                <td colspan="3">
                    <input class="btn btn-warning" type="submit" value="Edit">
                </td>
            </tr>
        }
    </tbody>
</table>

答案 1 :(得分:0)

未正确设置文字和隐藏输入的名称:

@Html.EditorFor(model => item.Quantity, null, "UserInputQuantity")

@Html.Hidden("ProductId", item.Product.ProductID)

如果您检查元素,则可以看到名称为UserInputQuantityProductId,但它们应该是。{ <{1}}和items[i].Quantity

您可以查看以下链接: MVC Model binding of complex objects