有一种非常复杂的方法可以实现这一点。如果有人知道更清洁的方法,请张贴。
您需要执行以下操作:
添加到您的模型:
- 一个布尔属性(列),将被隐藏并用作更改标识符
像这样在你的视图中设置你的表(我的例子是在 Razor 中):
@{
int j = 1;
for (var i = 0; i < Model.itemList.Count; i++)
{
<tr>
<td>
@Html.TextBoxFor(model => model.itemList[i].columnOne, new { onkeypress = "markAsChanged(" + @j + ", " + @i + ")" })
</td>
<td>
@Html.TextBoxFor(model => model.itemList[i].columnTwo, new { onkeypress = "markAsChanged(" + @j + ", " + @i + ")" })
</td>
<td>
@Html.TextBoxFor(model => model.itemList[i].columnThree, new { onkeypress = "markAsChanged(" + @j + ", " + @i + ")" })
</td>
<td>
@Html.TextBoxFor(model => model.itemList[i].columnFour, new { onkeypress = "markAsChanged(" + @j + ", " + @i + ")" })
</td>
<td>
@Html.TextBoxFor(model => model.itemList[i].columnFive, new { onkeypress = "markAsChanged(" + @j + ", " + @i + ")" })
</td>
<td>
@Html.HiddenFor(model => model.itemList[i].IsChanged)
</td>
</tr>
j++;
}
一旦有人更改了一行的字段,您的 JavaScript 函数就会编辑隐藏元素:
function rerunOldChange(rowIndex, changeIndex) {
var table = document.getElementById("changeTable");
var j = rowIndex;
var i = changeIndex;
var currentRow = table.rows[j];
var cellSix = currentRow.cells[5];
var thisRowIsChanged = "<input type = 'hidden' id = 'itemList_" + i + "__IsChanged' name = 'itemList[" + i + "].IsChanged' value = 'true' />"
cellSix.innerHTML = thisRowIsChanged;
}
它所做的是在有人按下该字段上的键时立即更改布尔值。因此,当您将列表传递给控制器以进行发布时,您只能对布尔值为 True 的行执行此操作。