我正在将一个webforms项目迁移到MVC,我遇到了一个转发器控件。转发器控件允许内联编辑(我的意思是每行都可以编辑(因为有一个允许这样做的标准),它上面有输入控件,可以更改值,还有一个编辑按钮,可以获取这些值并更新db)以及显示在表中的记录。
使用转发器控件可以很容易地判断哪条记录已更新,因为单击该记录编辑按钮时,它会调用ItemCommand函数传递已编辑的行,从而允许我获取该控件名称值以获取值。 如何在MVC中完成?我知道我们有显示模板和编辑模板但我需要将它们组合成1,我可以使用下面的代码,但如果我有更多可编辑的1行如何获取正确的输入控件行以获取值?
@foreach (var item in Model.Data)
{
if(item.User == "PIRA" || DateTime.Today != item.EntryDate.Value.Date)
{
<tr style="height: 25px;">
<td hidden="hidden">
@Html.DisplayFor(modelItem => item.TransactionID)
</td>
<td align="center">
@Html.DisplayFor(modelItem => item.EntryDate)
</td>
<td align="center">
@Html.DisplayFor(modelItem => item.User)
</td>
<td align="center">
@Html.DisplayFor(modelItem => item.EffectiveDate)
</td>
<td align="center">
@Html.DisplayFor(modelItem => item.RecordType)
</td>
<td align="right">
@Html.DisplayFor(modelItem => item.Value)
</td>
<td align="center">
@Html.DisplayFor(modelItem => item.Comments)
</td>
<td align="center">
</td>
</tr>
}
else
{
<tr style="height: 25px;">
<td hidden="hidden">
@Html.DisplayFor(modelItem => item.TransactionID)
</td>
<td align="center">
@Html.DisplayFor(modelItem => item.EntryDate)
</td>
<td align="center">
@Html.DisplayFor(modelItem => item.User)
</td>
<td align="center">
@Html.EditorFor(modelItem => item.EffectiveDate)
</td>
<td align="center">
@Html.DropDownListFor(modelItem => item.RecordType, Model.RecordTypes)
</td>
<td align="center">
@Html.EditorFor(modelItem => item.Value, new { style = "text-align: right;" })
</td>
<td align="center">
@Html.EditorFor(modelItem => item.Comments, new { cols = 50, @rows = 3 })
</td>
<td align="center">
<div style="margin-bottom:10px;">
<input type="submit" value="Edit" name="action:Edit" />
</div>
<div>
@Html.ActionLinkWithList("Delete", "Delete", "Capacity", new { id = item.TransactionID }, null)
</div>
</td>
</tr>
}
}
答案 0 :(得分:0)
我能够通过不使用DisplayFor()而不是控件* For()函数来获得这个,所以我可以设置id属性(因为DisplayFor()似乎不允许这样)。我将id设置为包含记录transactionID,因此每个输入都可以是唯一的。然后每个记录编辑链接将transactionID传递给javascript函数。然后在那里我有了id我可以构建id属性来获取所有输入值并让我的控制器调用。
即
@Html.TextBoxFor(modelItem => item.EffectiveDate, new { id="effectiveDate_" + item.TransactionID, @class="datepicker", style="width: 150px;" })
@Html.ActionLink("Edit", "Edit", "Data", new { onclick = "EditRecord(" + item.TransactionID + ");" })
function EditRecord(id) {
// get the control values based off the passed in id
var effDate = $("#effectiveDate_" + id).val();
// make the call to our controller passing in the edited row data
$.post("/Data/Edit/", { effectiveDate: effDate });
}
像这样手动操作有点痛苦,但它有效。在网络表单转发器控件中这可能是它在幕后所做的事情,所以我希望MVC也有这样的东西。