能够使用 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");

结果: