能够使用 ViewBag 动态地将行添加到 ViewModel
Ability to Add row to ViewModel dynamically with ViewBag
背景
我正在构建一个简单的库存和订购系统。其中一个订单 Order.cs
有多个订单项目 OrderItem
。我有一个 ViewModel。此外,订单商品的数量也应该更新库存,但我还没有走这么远
型号
public class Order
{
[Key]
public int Id { get; set; }
public int TotalItems { get; set; }
public DateTime DeliveryDate { get; set; }
public string OrderNumber { get; set; }
public string DeliveryAddress { get; set; }
[ForeignKey("ClientId")]
public int ClientId { get; set; }
public int OrderItemId { get; set; }
[ForeignKey("OrderItemId")]
public List<OrderItem> OrderItems { get; set; }
public Client Client { get; set; }
}
public class OrderItem
{
public int Id { get; set; }
[ForeignKey("OrderId")]
public int OrderId{ get; set; }
[ForeignKey("ItemInfoId")]
public int ItemInfoId { get; set; }
public int Quantity { get; set; }
public ItemInfo ItemInfo { get; set; }
public Order Order { get; set; }
}
public class OrderViewModel
{
//public int OrderId { get; set; }
//public string OrderNumber { get; set; }
//public string DeliveryAddress { get; set; }
//public int ClientId { get; set; }
//public DateTime Deliverydate { get; set; }
public Order Order { get; set; }
public IList<OrderItem> OrderItems { get; set; }
}
控制器
单击“创建”按钮时。
public IActionResult Create()
{
PopulateClientDropDownList();
CreateMultipleOrderItem();
return View();
}
我的 CreateMultipleOrderItem()
正在工作并返回一些值。
public IActionResult CreateMultipleOrderItem()
{
ViewBag.Item = new SelectList(_context.ItemInfos.ToList(), "Id", "ItemCode");
ViewBag.Items = JsonConvert.SerializeObject(new SelectList(_context.ItemInfos.ToList(), "Id", "ItemCode"));
return View();
}
剃刀视图
<table id="tblCustomers" class="table" cellpadding="0" cellspacing="0" >
<h3>Order Items</h3>
<thead>
<tr>
<th style="width:150px">Item Code</th>
<th style="width:150px">Quantity</th>
<th></th>
</tr>
</thead>
<tbody></tbody>
<tfoot id="item-list">
<tr>
<td>
<select asp-for="OrderItems[0].ItemInfoId" class="items" asp-items="@ViewBag.Item"></select>
</td>
<td><input type="text" asp-for="OrderItems[0].Quantity" class="items" /></td>
@*<td><input type="button" id="btnAdd" value="Add" /></td>*@
</tr>
</tfoot>
</table>
<button id="add">Add another item</button>
@section Scripts {
@{await Html.RenderPartialAsync("_ValidationScriptsPartial");}
<script src="http://ajax.microsoft.com/ajax/jquery/jquery-1.10.2.js" type="text/javascript"></script>
<script>
$("#add").click(function (e) {
e.preventDefault();
var i = ($(".items").length) / 2;
var model = @Html.Raw(@ViewBag.Items);
var n = '<tr><td><select id ="OrderItems_' + i + '_ItemInfoId" name="OrderItems[' + i + '].ItemInfoId" class="items"></select></td>' +
'<td><input type="text" class="items" name="OrderItems[' + i + '].Quantity" /></td>'+
'<td><button type="button" class="deletebtn">Delete</button></td></tr>
'
$("#item-list").append(n);
var Items = "";
$(model).each(function (e) {
Items = Items + '<option value="' + this.Value + '">' + this.Text + '</option>'
});
var subItemList = $("#OrderItems" + 1 + "_ItemInfoId");
subItemList.empty();
subItemList.append(Items);
});
</script>
}
我现在看到了这个,不确定为什么添加新行时,我的 ViewBag 项目没有返回到 Select 列表。
我已经被困在这里几天了,这是我目前为止最接近的一次。如果有人可以帮助我,我将不胜感激。
var subItemList = $("#OrderItems" + 1 + "_ItemInfoId");
根据您的代码:
<select id ="OrderItems_' + i + '_ItemInfoId" name="OrderItems[' + i + '].ItemInfoId" class="items"></select>
更改id与select中的id一致,如下:
var subItemList = $("#OrderItems_" + i + "_ItemInfoId");
结果:
背景
我正在构建一个简单的库存和订购系统。其中一个订单 Order.cs
有多个订单项目 OrderItem
。我有一个 ViewModel。此外,订单商品的数量也应该更新库存,但我还没有走这么远
型号
public class Order
{
[Key]
public int Id { get; set; }
public int TotalItems { get; set; }
public DateTime DeliveryDate { get; set; }
public string OrderNumber { get; set; }
public string DeliveryAddress { get; set; }
[ForeignKey("ClientId")]
public int ClientId { get; set; }
public int OrderItemId { get; set; }
[ForeignKey("OrderItemId")]
public List<OrderItem> OrderItems { get; set; }
public Client Client { get; set; }
}
public class OrderItem
{
public int Id { get; set; }
[ForeignKey("OrderId")]
public int OrderId{ get; set; }
[ForeignKey("ItemInfoId")]
public int ItemInfoId { get; set; }
public int Quantity { get; set; }
public ItemInfo ItemInfo { get; set; }
public Order Order { get; set; }
}
public class OrderViewModel
{
//public int OrderId { get; set; }
//public string OrderNumber { get; set; }
//public string DeliveryAddress { get; set; }
//public int ClientId { get; set; }
//public DateTime Deliverydate { get; set; }
public Order Order { get; set; }
public IList<OrderItem> OrderItems { get; set; }
}
控制器 单击“创建”按钮时。
public IActionResult Create()
{
PopulateClientDropDownList();
CreateMultipleOrderItem();
return View();
}
我的 CreateMultipleOrderItem()
正在工作并返回一些值。
public IActionResult CreateMultipleOrderItem()
{
ViewBag.Item = new SelectList(_context.ItemInfos.ToList(), "Id", "ItemCode");
ViewBag.Items = JsonConvert.SerializeObject(new SelectList(_context.ItemInfos.ToList(), "Id", "ItemCode"));
return View();
}
剃刀视图
<table id="tblCustomers" class="table" cellpadding="0" cellspacing="0" >
<h3>Order Items</h3>
<thead>
<tr>
<th style="width:150px">Item Code</th>
<th style="width:150px">Quantity</th>
<th></th>
</tr>
</thead>
<tbody></tbody>
<tfoot id="item-list">
<tr>
<td>
<select asp-for="OrderItems[0].ItemInfoId" class="items" asp-items="@ViewBag.Item"></select>
</td>
<td><input type="text" asp-for="OrderItems[0].Quantity" class="items" /></td>
@*<td><input type="button" id="btnAdd" value="Add" /></td>*@
</tr>
</tfoot>
</table>
<button id="add">Add another item</button>
@section Scripts {
@{await Html.RenderPartialAsync("_ValidationScriptsPartial");}
<script src="http://ajax.microsoft.com/ajax/jquery/jquery-1.10.2.js" type="text/javascript"></script>
<script>
$("#add").click(function (e) {
e.preventDefault();
var i = ($(".items").length) / 2;
var model = @Html.Raw(@ViewBag.Items);
var n = '<tr><td><select id ="OrderItems_' + i + '_ItemInfoId" name="OrderItems[' + i + '].ItemInfoId" class="items"></select></td>' +
'<td><input type="text" class="items" name="OrderItems[' + i + '].Quantity" /></td>'+
'<td><button type="button" class="deletebtn">Delete</button></td></tr>
'
$("#item-list").append(n);
var Items = "";
$(model).each(function (e) {
Items = Items + '<option value="' + this.Value + '">' + this.Text + '</option>'
});
var subItemList = $("#OrderItems" + 1 + "_ItemInfoId");
subItemList.empty();
subItemList.append(Items);
});
</script>
}
我现在看到了这个,不确定为什么添加新行时,我的 ViewBag 项目没有返回到 Select 列表。
我已经被困在这里几天了,这是我目前为止最接近的一次。如果有人可以帮助我,我将不胜感激。
var subItemList = $("#OrderItems" + 1 + "_ItemInfoId");
根据您的代码:
<select id ="OrderItems_' + i + '_ItemInfoId" name="OrderItems[' + i + '].ItemInfoId" class="items"></select>
更改id与select中的id一致,如下:
var subItemList = $("#OrderItems_" + i + "_ItemInfoId");
结果: