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

Send Viewmodel with list to controller

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

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

@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>();
        }
    }

我的视图很好地显示了我的视图模型中的数据,从检查此 post 中的第一张图片开始,似乎一切都已正确发送,但当它到达我的控制器时我仍然收到 null。

您需要在 ShoppingCartViewModel class 中将 Products 作为 property not field 公开,这就是使对象 null 作为模型绑定器需要 public setter 在 post.

填充模型

变化:

public List<ShoppingCartViewModelItem> Products;

至:

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

编辑:

另一件事我不确定 asp-for="Products[i].Product.id" 是否有效,但通常会像 asp-for="Model.Products[i].Product.id"

那样提供

希望对您有所帮助。