1

我已经从我的模型中的列表中生成了文本框,如下所示: -

@using (Ajax.BeginForm("Create", "Invoice", new AjaxOptions { OnBegin = "OnBegin", OnComplete = "OnCreateComplete" }))
{
    <table>
        <tr>
           <td>@Html.EditorFor(m => m.InvoiceItems[0].Title, new { @placeholder = "Title" }) @Html.ValidationMessageFor(m => m.InvoiceItems[0].Title)</td>
           <td>@Html.EditorFor(m => m.InvoiceItems[0].Description, new { @placeholder = "Description" }) @Html.ValidationMessageFor(m => m.InvoiceItems[0].Description)</td>
           <td>@Html.EditorFor(m => m.InvoiceItems[0].Amount, new { @placeholder = "Amount" }) @Html.ValidationMessageFor(m => m.InvoiceItems[0].Amount)</td>
        </tr>
        <tr>
           <td>@Html.EditorFor(m => m.InvoiceItems[1].Title, new { @placeholder = "Title" }) @Html.ValidationMessageFor(m => m.InvoiceItems[1].Title)</td>
           <td>@Html.EditorFor(m => m.InvoiceItems[1].Description, new { @placeholder = "Description" }) @Html.ValidationMessageFor(m => m.InvoiceItems[1].Description)</td>
           <td>@Html.EditorFor(m => m.InvoiceItems[1].Amount, new { @placeholder = "Amount" }) @Html.ValidationMessageFor(m => m.InvoiceItems[1].Amount)</td>
        </tr>
        <tr>
           <td>@Html.EditorFor(m => m.InvoiceItems[2].Title, new { @placeholder = "Title" }) @Html.ValidationMessageFor(m => m.InvoiceItems[2].Title)</td>
           <td>@Html.EditorFor(m => m.InvoiceItems[2].Description, new { @placeholder = "Description" }) @Html.ValidationMessageFor(m => m.InvoiceItems[2].Description)</td>
           <td>@Html.EditorFor(m => m.InvoiceItems[2].Amount, new { @placeholder = "Amount" }) @Html.ValidationMessageFor(m => m.InvoiceItems[2].Amount)</td>
        </tr>
</table>
<input type="submit" value="Create" />
}

如果我提交这个,它会将所有行发布到控制器。但是如果我删除任何像第二行这样的随机行,它只会将第一行发布到控制器。

现在我可以编写一个逻辑来获取控制器上的所有有效行,就像我使用javascript设置一个skip_rows变量并在我的控制器中编写一个循环来读取基于表单行和skip_value的行一样。但不是这个,我正在寻找一些更好的方法。

请指教。

4

1 回答 1

3

如果我提交这个,它会将所有行发布到控制器。但是如果我删除任何像第二行这样的随机行,它只会将第一行发布到控制器。

每当索引链断开时,模型绑定器就会失去它的魔力。因此,例如,您有三个项目,然后删除最后一个,留下以下元素:

m.InvoiceItems[0]
m.InvoiceItems[1]
// "m.InvoiceItems[2]" was deleted

模型绑定器将能够完全传递您的 InvoiceItems - 有两个项目。下一个示例将不起作用:

m.InvoiceItems[0]
// m.InvoiceItems[1]  was deleted
m.InvoiceItems[2]

这也是如此(不起作用):

// m.InvoiceItems[0] was deleted
m.InvoiceItems[1]  
m.InvoiceItems[2]

所以,你可以做什么?您可以使用IsDeleted或标记您删除的每一行,IsRemoved并使其成为 an 的属性,InvoiceItem然后在控制器中处理它。

于 2013-04-30T05:41:26.913 回答