将带有列表的 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"
那样提供
希望对您有所帮助。
我正在尝试将具有复杂类型的视图模型提交到我的控制器,但是当它到达控制器时我的视图模型为空。
以下是我认为的相关代码:
@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"
希望对您有所帮助。