中继器模拟问题

时间:2014-05-08 13:06:50

标签: c# asp.net-mvc

我正在将一个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">
                &nbsp;
                @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">
                &nbsp;
            </td>
        </tr>
    }
    else
    {
        <tr style="height: 25px;">
            <td hidden="hidden">
                &nbsp;
                @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>
    }
}

1 个答案:

答案 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也有这样的东西。