具有动态数量的 List<string> 的 Mvc EditorTemplate

Mvc EditorTemplate for List<string> with dynamic amount

我为模型中的列表创建了一个简单的 EditorTemplate (Views/Shared/EditorTemplates/List.cshtml):

@model List<string>
foreach (var str in Model)
{
    <li>
        @Html.LabelFor(m => str, "My Label")
        @Html.TextBoxFor(m => str)
        @Html.ValidationMessageFor(m => str)
    </li>
}

在我看来是这样调用的 (Views/Profile.cshtml):

@using (Html.BeginRouteForm(MvcSettings.SitecoreRouteName, FormMethod.Post, new { data_abide = "true", id = "myForm", enctype = "multipart/form-data" }))
{
    @Html.Sitecore().FormHandler("User", "UpdateProfile")
    @Html.ValidationSummary()

    @Html.EditorFor(x => x.ListTest, new { htmlAttributes = new { id = "listTestId" } })

    <input type="submit" value="Submit" />
}

受控动作:

public ActionResult UpdateProfile(IntranetContactViewModel formModel)
{
    // Save information to DB
}

型号:

public class IntranetContactViewModel
{
    public List<string> ListTest { get; set; }

    public IntranetContactViewModel()
    {
        ListTest = new List<string>{"abc","def","ghi"};
    }
}

当列表包含 3 个字符串时,视图将呈现 3 个文本框。

<input class="text-box single-line" id="listTestId" name="ListTest[0]" type="text" value="abc">
<input class="text-box single-line" id="listTestId" name="ListTest[1]" type="text" value="def">
<input class="text-box single-line" id="listTestId" name="ListTest[2]" type="text" value="ghi">

但是,用户可以插入的选项数量应该没有限制。如果所有 3 个文本框都已填写,则应该出现第 4 个(理想情况下,如果超过 2 个文本框为空,则应删除 1 个)。

我自己尝试添加一个具有相同签名的文本框(在名称属性内的计数器中添加 1)

<input class="text-box single-line" id="listTestId" name="ListTest[3]" type="text" value="TEST">

但是当我提交这个时,它没有被模型识别并且没有返回给控制器。 有没有办法让我的模型知道它现在还需要跟踪这个新的文本框?或者这根本不可能?

请指教

@Html.EditorFor(x => x.ListTest, new { htmlAttributes = new { id = "listTestId" } })

应该是:

@Html.EditorFor(x => x.ListTest)

我强制所有文本框使用相同的 ID,这搞砸了系统。 感谢评论里的大家帮忙!