【问题标题】:Add dynamic form fields in ASP.NET Core MVC App在 ASP.NET Core MVC App 中添加动态表单字段
【发布时间】:2019-01-28 09:28:46
【问题描述】:

在我的应用程序中,我想制作可以具有动态属性列表的模型:

提供者类

using System;
using System.Collections.Generic;

namespace DynamicForms.Models
{
    public class Provider
    {
        public String Name { get; set; }
        public List<Attribute> Attributes { get; set; }

        public Provider()
        {
            Attributes = new List<Attribute>();
        }
    }
}

我的控制器有两种方法。一种用于向当前模型添加更多属性,另一种用于保存 Provider 模型。添加更多属性的方法如下:

    [HttpPost]
    // Add attribute to current provider model
    public IActionResult Index(Provider provider)
    {
        provider.Attributes.Add(new Models.Attribute());
        return View(provider);
    }

我的观点是这样的:

@model Provider
@using (Html.BeginForm())
{
    <div>
        @Html.TextBoxFor(m => m.Name)
        <input type="submit" value="Add attribute" formmethod="post"/>
    </div>
    <div>
        @foreach ( var attribute in Model.Attributes)
        {
        <div>
            @Html.TextBoxFor(a => attribute.Name)
            @Html.TextBoxFor(a => attribute.Value)
        </div>
        }
    </div>
    <div>
        <input type="submit" value="Save form" formaction="Provider/Save" formmethod="post"/>
    </div>
}

当我按下“添加属性”按钮时,添加了属性并出现了一行输入字段。但是,当我再按一次按钮时,什么也没有发生。没有添加其他行。模型属性计数仍然是 1。我一直在网上寻找解决方案,但找不到任何可以解决我问题的方法。如何使表单字段动态添加到模型并在视图中显示?

【问题讨论】:

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


    【解决方案1】:

    尝试使用索引而不是 foreach 循环遍历您的列表,例如

    @for (var i = 0; i < Model.Attributes.Count; i++)
    {
      <div>
        @Html.TextBoxFor(a => Model.Attributes[i].Name)
        @Html.TextBoxFor(a => Model.Attributes[i].Value)
      </div>
    }
    

    您希望名称的格式类似于 Attributes[0].Name 等。

    【讨论】:

    • 哇,这就像那样工作。太感谢了。但是为什么 foreach 在这种情况下不起作用?你能解释一下吗?
    • @Kamilton 因为如果您使用变量名称绑定,则索引不会将其放入名称中,并且模型绑定不会将其放入数组中。尝试做一个 ViewSource 并查看名称是什么,这将是有意义的。
    【解决方案2】:

    您为 Post 编写了一个方法,但您为 get 编写了一个方法。

    获取方法

       public IActionResult Index()
        {
            Provider provider = new Provider();
            provider.Attributes.Add(new Models.Attribute());
            return View(provider);
        }
    

    发布方法

       [HttpPost]
        // Add attribute to current provider model
        public IActionResult Index(Provider provider)
        {
            provider.Attributes.Add(new Models.Attribute());
            return View(provider);
        }
    

    【讨论】:

    • 你这是什么意思?我也有一个 get 方法,但在这种情况下这并不重要,不是吗?
    猜你喜欢
    • 2018-11-01
    • 2015-04-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-11-25
    • 2021-03-24
    • 2011-09-02
    相关资源
    最近更新 更多