【问题标题】:form for a model that contains a list property in asp.net core 3 MVC在 asp.net core 3 MVC 中包含列表属性的模型的表单
【发布时间】:2021-02-04 10:43:16
【问题描述】:

我正在尝试在 asp.net core 3 MVC 中创建一个表单。

模型是一个“包”类,包含关于包的不同属性,以及包中项目的List<item> items 属性,项目是定义的包含“项目”不同属性的类。

我应该如何为用户创建一个表单来添加一个新的“包”?
加上在其中插入项目,可以是任意数量的项目,我希望用户为每个项目插入一行(带有为新项目添加新输入行的按钮)并使用最终表单提交。

任何帮助将不胜感激。

【问题讨论】:

    标签: c# asp.net-mvc forms asp.net-core-mvc


    【解决方案1】:

    这是一个完整的工作演示:

    型号:

    public class Package
    {
        public int Id { get; set; }
        public string Name { get; set; }
        public List<Item> Items { get; set; }
    }
    public class Item
    {
        public int Id { get; set; }
        public string ItemName { get; set; }
    }
    

    查看:

    @model Package
    <h1>Create</h1>
    
    <h4>Package</h4>
    <hr />
    <div class="row">
        <div class="col-md-4">
            <form asp-action="Create">
                <div asp-validation-summary="ModelOnly" class="text-danger"></div>
                <div class="form-group">
                    <label asp-for="Name" class="control-label"></label>
                    <input asp-for="Name" class="form-control" />
                    <span asp-validation-for="Name" class="text-danger"></span>
                </div>
                <button onclick="addRow()" type="button">Add Row</button>
                <table id="AddItemsTable">
                    <tr>
                        <th>@Html.DisplayNameFor(model=>model.Items[0].ItemName)</th>
                    </tr>
                </table>
                <div class="form-group">
                    <input type="submit" value="Create" class="btn btn-primary" />
                </div>
            </form>
        </div>
    </div>
    
    <div>
        <a asp-action="Index">Back to List</a>
    </div>
    

    JS:

    @section Scripts {
        <script>
            var counter = 0;
            function addRow() {
                var table = document.getElementById("AddItemsTable");
                var row = table.insertRow(-1);
                var cell1 = row.insertCell(0);
                cell1.innerHTML = '<input type="text" name="Items[' + counter+'].ItemName"/>';
                counter++;
            }
        </script>
    }
    

    控制器:

    // GET: Packages/Create
    public IActionResult Create()
    {
        return View();
    }
    
    // POST: Packages/Create
    [HttpPost]
    [ValidateAntiForgeryToken]
    public async Task<IActionResult> Create(Package package)
    {
        if (ModelState.IsValid)
        {
            _context.Add(package);
            await _context.SaveChangesAsync();
            return RedirectToAction(nameof(Index));
        }
        return View(package);
    }
    

    结果:

    【讨论】:

    • 谢谢!! ,您是否知道如何对表单中的项目字段应用验证?我已将 [required] 添加到包类的 List 字段中,但它并没有真正做任何事情。
    • 您好,如果您只是需要验证,我认为您可以通过js添加html,例如:&lt;input type="text" name="Items[' + counter+'].ItemName" required/&gt;。但是如果您需要其他验证,您可以自定义客户端验证。
    猜你喜欢
    • 2011-06-10
    • 2020-03-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-02-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多