如何仅捕获用户更改了值的多行中的那些列?



ASP.NET 或JavaScript中是否有任何方法可以仅在用户已更新特定列的那些行上运行更新存储过程?

例如:如果有多行

row1= [column1 column2 column3 column4 coumn 5]
row2= [column1 column2 column3 column4 coumn 5]
row3= [column1 column2 column3 column4 coumn 5]
row4= [column1 column2 column3 column4 coumn 5]

如果第 2 列和第 3 列在第 1 行中更新,第 1 列和第 4 列在第 3 行中更新,我只想捕获这些行和列并将其作为 JSON 字符串传递给列表,然后我将其转换为数据表?

我应该采取什么方法?

我尝试过的:

谷歌搜索了一些样品,但专家意见总是最好的

有一个非常复杂的方法可以实现这一点。如果有人知道更清洁的方法,发布它。

您需要执行以下操作:

添加到您的模型: - 将被隐藏并用作更改标识符的布尔属性(列(

在视图中像这样设置表(我的示例在 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 的行执行此操作。

我将进行一些更新和简化以@C墨菲的响应,但在视图模型中设置隐藏字段是最好的选择。我建议使用复选框,因为它默认是布尔值,并且易于通过其checked属性进行操作。

按键事件已弃用,并且不会在所有键上触发 - 特别是,退格键和删除键不会触发它,因此有人可以删除字段中的所有内容,并且不会发生更新。请改用keydown事件;这会产生相反的效果,因为每个键都会触发它,包括Shift和其他可能不会实际更改字段的键。如果需要,可以验证其他代码中的更改。

我删除了检查每列更改的代码,因为我假设您的更新逻辑要求对象的所有数据,或者使用 EF 可能期望传递整个对象。

剃刀:

// A text field, change PropertyName and add where needed in markup
@Html.TextBoxFor(model => model.itemList[i].PropertyName, new { onkeydown = "markAsChanged(" + i + ")" })
// Hidden checkbox for the IsChanged property
@Html.CheckBoxFor(model => model.itemList[i].PropertyName, new { hidden = "" })

Javascript:

// Modern browsers
var markAsChanged = function(i) {
document.GetElementById('itemList_' + i + '__IsChanged').checked = true;
};
// Use for legacy support with jQuery
var markAsChanged = function(i) {
$('#itemList_' + i + '__IsChanged').checked = true;
};

如果你想清理你的视图并省略事件处理程序,你可以用更多的Javascript添加它们。

最新更新