将带有列表的Viewmodel发送到控制器

时间:2018-11-26 13:42:47

标签: c# asp.net asp.net-core controller asp.net-mvc-viewmodel

我正在尝试将具有复杂类型的视图模型提交给控制器,但是当视图模型碰到控制器时,该视图模型为null。

Formdata in request in Network tab(chrome)

以下是我认为相关的代码:

@model ShoppingCartViewModel

@{
    ViewData["Title"] = "Indkøbskurv";
}

<h2>Indkøbskurv</h2>
<form method="post" asp-controller="ShoppingCart" asp-action="SaveProductsHistory">

    <div class="row" style="margin-bottom:30px">
        <div class="col-md-9"></div>
        <div class="col-md-3">
            <button type="submit" id="saveAndDeleteShoppingCart" class="btn btn-warning">Gem og slet kurv  <i class="fas fa-shopping-cart"></i></button>
        </div>
    </div>
    <table class="table">
        <thead>
            <tr>
                <th>Produktnavn</th>
                <th>Varenummer</th>
                <th>Antal</th>
                <th></th>
            </tr>
        </thead>
        <tbody>
            @for (int i = 0; i < Model.Products.Count(); i++)
            {               
                <tr>
                    <td>
                        <div class="form-group">
                            <input type="text" asp-for="Products[i].Product.id" />
                            <input type="text" asp-for="Products[i].Product.area" />
                            <input type="text" asp-for="Products[i].Product.eurofinsItemNumber" />
                            <input type="text" asp-for="Products[i].Product.internetAddress" />
                            <input type="text" asp-for="Products[i].Product.ourResponsibility" />
                            <input type="text" asp-for="Products[i].Product.productNameEnvAir" />
                            <input type="text" asp-for="Products[i].Product.productNameSupplier" />
                            <input type="text" asp-for="Products[i].Product.storageSize" />
                            <input type="text" asp-for="Products[i].Product.storageType" />
                            <input type="text" asp-for="Products[i].Product.supplierName" />
                            <input type="text" asp-for="Products[i].Product.supplierProductNumber" />
                            <input type="text" asp-for="Products[i].Product.supplierProductNumberInfo" />
                            <input type="text" asp-for="Products[i].Product.unit" />
                            <input type="text" asp-for="Products[i].Quantity" />
                        </div>
                    </td>
                    <td>
                    </td>
                    <td>
                        <a class="adjust-button dec" aria-label="Decrease quantity" href="#">-</a>
                        <input class="adjust-input" value="@Model.Products[i].Quantity">
                        <input id="productID" type="hidden" value="@Model.Products[i].Product.id" />
                        <a class="adjust-button inc" aria-label="Increase quantity" href="#">+</a>
                    </td>
                    <td>
                        <button id="removeProductFromCookies"><i class="far fa-trash-alt"></i></button>
                    </td>
                </tr>
            }
        </tbody>
    </table>
</form>

以及我对控制器的操作

 [HttpPost]
 public void SaveProductsHistory(ShoppingCartViewModel shoppingCartViewModels)
        {}

和我的视图模型

public class ShoppingCartViewModel
    {
        public List<ShoppingCartViewModelItem> Products;

        public ShoppingCartViewModel()
        {
            Products = new List<ShoppingCartViewModelItem>();
        }
    }

我的视图很好地显示了我的视图模型中的数据,并且似乎所有内容都已通过检查本文中的第一张图片正确发送,但是当它到达我的控制器时,我仍然收到null。

1 个答案:

答案 0 :(得分:1)

您需要在Products类中将ShoppingCartViewModel公开为property而不是field,这使得将对象null作为模型绑定器需要公共设置器填补模型在后期。

更改:

public List<ShoppingCartViewModelItem> Products;

收件人:

public List<ShoppingCartViewModelItem> Products { get; set; }

编辑:

我不确定asp-for="Products[i].Product.id"是否有效,但通常它像asp-for="Model.Products[i].Product.id"一样提供

希望有帮助。