从View发送动态列表到Controller

时间:2015-03-24 07:30:12

标签: asp.net-mvc asp.net-mvc-5

当我添加/删除行时,我得到了很多回复。

加载页面时,将添加默认行3(但用户可以删除这些行) 当我尝试添加新行时,控制器中会有4个值行,但是当我尝试删除任何默认行时,它不会显示新添加的行。 这是我的下面的代码。

@model ProductRegistration.Models.InstalledProductInformationModel
@using (Html.BeginForm())
{
    @for (int i = 0; i < ((Model != null && Model.listInstallProducts != null) ? Model.listInstallProducts.Count : 3); i++)
    {
        <tr>
            <td>
                @Html.TextBoxFor(m => m.listInstallProducts[i].SerialNumber, new { @class = "form-control input-sm input-Serial", @placeholder = "Enter serial number", @maxlength = 50, @OnKeypress = "return alphanumeric_only(event);" })
                @Html.ValidationMessageFor(m => m.listInstallProducts[i].SerialNumber)
                <div class="SerialErrorDisplay" style="color: red"></div>
            </td>
            <td>
                @Html.DropDownListFor(m => m.listInstallProducts[i].ModelNumber, new SelectList(string.Empty, "Value", "Text"), "--Select Model--", new { @class = "form-control input-sm input-Model" })
                @Html.ValidationMessageFor(m => m.listInstallProducts[i].ModelNumber)
                <div class="ModelErrorDisplay" style="color: red"></div>
            </td>
            <td>
                @Html.TextBoxFor(m => m.listInstallProducts[i].InstallationDate, new { @class = "form-control input-sm input-Date", @maxlength = 50, @placeholder = "DD/MM/YYYY" })
                @Html.ValidationMessageFor(m => m.listInstallProducts[i].InstallationDate)
                <div class="DateErrorDisplay" style="color: red"></div>
            </td>
            <td>
                <img src="~/Images/delete_icon.png" onclick="DeleteProduct(this);" />
            </td>
        </tr>
    }
    <input class="btn btn-primary top-padding" type="submit" value="Previous" id="back-step" name="direction"/>
}

在控制器中:

public ActionResult InstalledProductInfo(InstalledProductInformationModel InstalledProducts, string direction)
{
    if(ModelState.IsValid)
    {
        return RedirectToAction("EquipmentOwnerInfo");
    }
    return View(InstalledProducts);
}

模型是:

public class InstalledProductInformationModel : InstalledProductInformation
{
    public InstalledProductInformation installedProductInformation { get; set; }
    public List<InstalledProductInformation> listInstallProducts { get; set; }
}

请帮帮我。

2 个答案:

答案 0 :(得分:0)

列表索引是连续枚举的,所以没有间隙。如果删除一行,则列表索引不再是连续的。如果你要处理索引,新行应该在那里。

答案 1 :(得分:0)

默认情况下,DefaultModelBinder所需的集合索引器从零开始并且是连续的。如果删除第一个项目(indexer = 0),则不会绑定任何项目。如果删除第3项(indexer = 2),则仅绑定前2项。您可以通过为名为Index的特殊属性添加输入来覆盖此行为,其中值等于索引器。

@for (int i = 0; i < ((Model != null && Model.listInstallProducts != null) ? Model.listInstallProducts.Count : 3); i++)
{
  <tr>
    <td>
      @Html.TextBoxFor(m => m.listInstallProducts[i].SerialNumber, new { @class = "form-control input-sm input-Serial", @placeholder = "Enter serial number", @maxlength = 50, @OnKeypress = "return alphanumeric_only(event);" })
      @Html.ValidationMessageFor(m => m.listInstallProducts[i].SerialNumber)
      <div class="SerialErrorDisplay" style="color: red"></div>
    </td>
    ....
    <td>
      // Add the following input
      <input type="hidden" name="listInstallProducts.Index" value="@i" /> 
      <img src="~/Images/delete_icon.png" onclick="DeleteProduct(this);" />
    </td>
  </tr>
}
<input class="btn btn-primary top-padding" type="submit" value="Previous" id="back-step" name="direction"/>

附注:在将模型传递给视图之前,您应该在控制器中添加3个项目,以便获得正确的模型绑定,然后只需使用@for (int i = 0; i < Model.listInstallProducts.Count; i++)