【问题标题】:How to dynamically add to list with ViewModel in ASP.NET Core 3.1 MVC with JavaScript and C#如何使用 JavaScript 和 C# 在 ASP.NET Core 3.1 MVC 中使用 ViewModel 动态添加到列表
【发布时间】:2020-04-29 21:08:33
【问题描述】:

我正在尝试使用 JavaScript 在我的 ViewModel 中动态添加列表属性。每当我提交表单时,post 控制器的列表中都没有项目。我尝试使用 razor 语法添加到 JavaScript 函数中的列表,如下所示:

@{
    Model.Contacts.Add(new Contact { ID = 1, FirstName = "Tester" })
}

只是想看看我是否能在列表中找到一个项目。我还在页面顶部做了它,看看它是否只是因为它是在 JavaScript 中的。但是,当我提交表单时,同样的事情发生了,列表中没有项目。我不知道是否需要创建 API 才能提交数据,但 Company 属性会在其中提交数据。我希望能够提交这两个属性而无需创建 API。我不知道是否有一种特殊的剃刀语法或类可以用来实现这一点。请帮忙!谢谢。

Create Company Page

视图模型:

public class CompanyViewModel
    {
        public Company Company { get; set; }
        public List<Contact> Contacts { get; set; }

        public CompanyViewModel()
        {
            this.Contacts = new List<Contact>();
        }
    }

控制器:

        public IActionResult Create()
        {
            var vm = new CompanyViewModel();
            return View(vm);
        }

        [HttpPost]
        [ValidateAntiForgeryToken]
        public async Task<IActionResult> Create(CompanyViewModel companyView)
        {
            if (companyView.Company != null)
            {
                _context.Add(companyView.Company);
                if (companyView.Contacts != null)
                    _context.Contacts.AddRange(companyView.Contacts);
                await _context.SaveChangesAsync();
                return RedirectToAction(nameof(Index));
            }
            return View(companyView);
        }

查看:

@model CheckbookRegister.Models.CompanyViewModel

@{
    ViewData["Title"] = "Create";
}

<h1>Create Company</h1>
<hr />
<form asp-action="Create">

    <!-- Omitted for brevity -->

    <div class="row justify-content-between">
        <h4 class="col mb-0 align-self-end">Contacts</h4>
        <div class="col-md-auto text-right mt-2">
            <a class="col btn btn-sm btn-outline-success px-4" id="add" href="#" onclick="addContact()">Add</a>
        </div>
    </div>
    <table class="table mt-2" id="contactsTable">
        <thead>
            <tr>
                <th><label asp-for="@Model.Contacts.First().FirstName" class="control-label"></label></th>
                <th><label asp-for="@Model.Contacts.First().LastName" class="control-label"></label></th>
                <th><label asp-for="@Model.Contacts.First().Email" class="control-label"></label></th>
                <th><label asp-for="@Model.Contacts.First().PhoneNumber" class="control-label"></label></th>
                <th><label asp-for="@Model.Contacts.First().WorkPhoneNumber" class="control-label"></label></th>
                <th></th>
            </tr>
        </thead>
        <tbody>
        </tbody>
    </table>
    <div class="form-group">
        <input type="submit" value="Create" class="btn btn-primary"/>
    </div>
</form>

@section Scripts{ 
    <script type="text/javascript">
        var count = 0;
        function addContact() {
            var table = document.querySelector("tbody");
            table.insertAdjacentHTML("beforeend", "<tr>" +
                "<td>" +
                "<input asp-for='Model.Contacts[" + count + "].FirstName' class='form-control'/>" +
                "<span asp-validation-for='Model.Contacts[" + count + "].FirstName' class='text-danger'></span >" +
                "</td>" +
                "<td>" +
                "<input asp-for='Model.Contacts[" + count + "].LastName' class='form-control'/>" +
                "<span asp-validation-for='Model.Contacts[" + count + "].LastName' class='text-danger'></span >" +
                "</td>" +
                "<td>" +
                "<input asp-for='Model.Contacts[" + count + "].Email' class='form-control'/>" +
                "<span asp-validation-for='Model.Contacts[" + count + "].Email' class='text-danger'></span >" +
                "</td>" +
                "<td>" +
                "<input asp-for='Model.Contacts[" + count + "].PhoneNumber' class='form-control'/>" +
                "<span asp-validation-for='Model.Contacts[" + count + "].PhoneNumber' class='text-danger'></span >" +
                "</td>" +
                "<td>" +
                "<input asp-for='Model.Contacts[" + count + "].WorkPhoneNumber' class='form-control'/>" +
                "<span asp-validation-for='Model.Contacts[" + count + "].WorkPhoneNumber' class='text-danger'></span >" +
                "</td>" +
                "<td>" +
                "<button type='button' class='btn btn-sm btn-outline-danger' onclick='deleteContact(this)'>Delete</button>" +
                "</td>" +
                "</tr>");
            count++;
        }
        function deleteContact(button) {
            button.closest("tr").remove();
        }
    </script>
}

【问题讨论】:

    标签: javascript c# asp.net-core model-view-controller


    【解决方案1】:

    因此,要一一添加联系人,您的视图模型应该是联系人,并且您的表单应该如下所示,除了使用您的联系人类属性而不是电子邮件密码。

    <form asp-controller="Demo" asp-action="RegisterInput" method="post">
        Email:  <input asp-for="Email" /> <br />
        Password: <input asp-for="Password" /><br />
        <button type="submit">Register</button>
    </form>
    

    您的控制器应该接受联系人类作为参数。 这将适用于一一添加联系人。

    对于多个联系人,使用与联系人列表相同的视图模型。然后使用 for each on that list 在您的视图中,然后为每个联系人属性及其值添加输入。

    当您必须添加新联系人时,基本上通过 js 在添加按钮的单击事件上为新联系人生成 html。

    按照这个问题,你会走在正确的轨道上: How to add an item to a list in a ViewModel using Razor and .NET Core?

    【讨论】:

    • 结果是它的剃须刀页面。它会在您加载网页时生成网页代码(我猜),然后当我通过 JavaScript 添加一行时,不会生成 asp 属性,因此输入没有正确的 ID 和属性。我很感激,如果没有那个链接,我将无法弄清楚。
    • 是的,这是正确的,所以通过 JavaScript,您不需要添加 asp 属性。您添加生成的 html。加载页面,为开发工具点击 f12,复制生成的 html 并通过 JavaScript 事件添加该 html。
    猜你喜欢
    • 2023-04-08
    • 2016-07-18
    • 1970-01-01
    • 2013-12-17
    • 2017-09-26
    • 1970-01-01
    • 1970-01-01
    • 2022-10-07
    • 1970-01-01
    相关资源
    最近更新 更多