C# 将MVC中的复杂对象数组与具有“添加”按钮的页面绑定

C# 将MVC中的复杂对象数组与具有“添加”按钮的页面绑定,c#,asp.net-mvc,razor,C#,Asp.net Mvc,Razor,我有以下课程 public class RegistrationFieldsetSettingInfo { public RegistrationFieldsetSettingInfo() { Fields = new List<FieldInfo>(); } public List<FieldInfo> Fields { get; set; } } public class FieldInfo { publi

我有以下课程

public class RegistrationFieldsetSettingInfo 
{
    public RegistrationFieldsetSettingInfo()
    {
        Fields = new List<FieldInfo>();
    }

    public List<FieldInfo> Fields { get; set; }
}

public class FieldInfo
{
    public string Key { get; set; }
    // removed other properties to simplify the question
}
公共类注册字段集设置信息
{
公共注册FieldSettingInfo()
{
字段=新列表();
}
公共列表字段{get;set;}
}
公共类字段信息
{
公共字符串密钥{get;set;}
//删除了其他属性以简化问题
}
我有一个剃须刀视图如下。它有一个“添加”按钮,用于添加一行新的输入,这实际上是一个新的FieldInfo对象。下面的工作正常,但是现在我想我需要添加jquery来修改新行中所有字段的索引,它看起来很笨拙。有更好的方法吗?你知道我如何添加jquery魔法来自动填充索引吗

for (int i = 0; i < Model.Fields.Count(); i++)
{
    if (!String.IsNullOrWhiteSpace(Model.Fields[i].Title))
    {
        <div class="form-row">
            @Html.Hidden("Fields.index", $"{i}")
            <div class="col-auto">
                <div class="input-group mb-2">
                    <div class="input-group-prepend">
                        <div class="input-group-text">Field name</div>
                    </div>
                    @Html.TextBox($"Fields[{i}].Key", Model.Fields[i].Key, new { @class = "form-control", size = "10" })
                </div>
            </div>
    }
}


<div class="copy-fields">
    <div class="form-row">
        @Html.Hidden("Fields.index", "100")
        <div class="col-auto">
            <div class="input-group mb-2">
                <div class="input-group-prepend">
                    <div class="input-group-text">Field name</div>
                </div>
                @Html.TextBox("Fields[100].Key", "", new { @class = "form-control", size = "10" })
            </div>
        </div>
    </div>
</div>
<div class="after-add-more"></div>
<button type="button" class="btn btn-link add-more">
    Add field
</button>

<script>
    $(document).ready(function () {
        $(".add-more").on('click', function () {
            var html = $(".copy-fields").clone();
            $(".after-add-more").before(html[0]);
            html.find('input').val('');
        });
    });
</script>
for(int i=0;i
这是我在MVC中获得绑定数据的唯一方法

解决方案: 好的,我想出了一个简单的方法来处理这个问题。我做的控制器签名是这样的

    [HttpPost]
    public ActionResult AddEditSpecial(RegistrationFieldsetSettingInfo settingInfo, string[] Titles, string[] Keys, FieldType[] Types, bool[] Mandatories)
    {
        settingInfo.Fields = new List<FieldInfo>();
        for (var i = 0; i < Titles.Length; i++)
        {
            if (!String.IsNullOrWhiteSpace(Titles[i]) && !String.IsNullOrWhiteSpace(Keys[i]))
            {
                settingInfo.Fields.Add(new FieldInfo
                {
                    Title = Titles[i],
                    Key = Keys[i],
                    Type = Types[i],
                    Mandatory = Mandatories[i]
                });
            }
        }
        return base.AddEdit(settingInfo);
    }
[HttpPost]
public ActionResult AddEditSpecial(注册字段设置信息设置信息、字符串[]标题、字符串[]键、字段类型[]类型、布尔[]强制)
{
settingInfo.Fields=新列表();
对于(变量i=0;i

并将razor中的所有字段修改为平面字段,即代替字段[{i}]。Key或字段[100]。Key,我只是将它们设置为“Key”。因此,它们最终在控制器中作为一个单独的参数,我只是编写一些代码将它们添加到实际对象中。不是很漂亮,但却是我能想到的最好的。

是否有一些jquery可以在提交之前自动为索引编号?