ASP.NET MVC - 删除表中的行,然后更新数据库

时间:2011-09-05 17:50:36

标签: asp.net-mvc

在我的雅虎电子邮件中,收件箱显示为电子邮件项目列表。单击该项目将显示其详细信息。现在,回到收件箱。列表中的一列是复选框。如果我单击一个或多个复选框,然后单击“删除”,则删除所有这些项目。

这或多或少是我想用ASP.NET MVC应用程序实现的。我有一个包含一些行的表,我可以勾选一些复选框来删除所选行并更新数据库。

我来自Web窗体背景。如果单击删除按钮,它将进行回发,我可以在我的代码中检查需要删除的项目。但是,我在ASP.NET MVC中这样做,我没有回发或查看状态的好处。我认为这可以通过AJAX实现,但我希望有一个更简单的解决方案,就像一个简单的表单帖子。不幸的是,我不知道从哪里开始。

此时我可以使用JQuery删除客户端上的行,但我还没有在数据库部分上有任何内容。任何提示都非常感谢。

以下是我的观看代码:

@model IEnumerable<Simplex.Data.Models.MessageBoardModel>

@{
    ViewBag.Title = "Message Board";
}

<script type="text/javascript">
    function deleteItems() {
        $('.td_checkbox:checked').closest('tr').closest(tr).remove();
    }

    $(document).ready(function () {
        $('#btnDelete').click(function () {
            deleteItems();
        });
    });
</script>

<div id="content">
    <h2>Board List</h2>
    @{ Html.RenderAction("search", "home"); }
    <div class="board_list">
        <table>
            <tr>
                <th>
                    No
                </th>
                <th>
                    Subject
                </th>
                <th>
                    Posted By
                </th>        
                <th>
                    Posting Date
                </th>
            </tr>

    @foreach (var item in Model) {
        <tr id=@item.Id>
            <td>
                @Html.DisplayFor(modelItem => item.Id)
            </td>
            <td class="subject">
                <a href="@Url.Action("details", new { id = item.Id })"><input class="td_checkbox" type="checkbox" />&nbsp;@item.Subject</a>
            </td>
            <td>
                @Html.DisplayFor(modelItem => item.Username)
            </td>        
            <td>
                @Html.DisplayFor(modelItem => item.DatePosted)
            </td>
        </tr>
    }
    </table>
    <button id="btnDelete">Delete</button>
    <a href="@Url.Action("create")"><input type="button" value="Post" /></a>
</div>

2 个答案:

答案 0 :(得分:1)

第一期,请勿使用@foreach来消除内置的集合处理。请改用@Html.DisplayForModel()。这将正确创建正确的索引项名称和ID。

然后在您的HttpPost处理程序中,您将希望将参数作为集合,并且您可以遍历列表并查看已设置的复选框。

答案 1 :(得分:0)

使用for循环为每条消息呈现以下内容:

<input name="messages[@i.ToString()].Key" type="hidden" value="@item.Id" />
<input name="messages[@i.ToString()].Value" type="checkbox" value="true" />

然后像这样

捕捉你动作中的POSTed值
[HttpPost]
public ActionResult Delete(Dictionary<int,bool> messages)
{
  IEnumerable<int> idsOfItemsYouWantToDelete = messages.Where(pair => pair.Value).Select(pair => pair.Key);
// Do delete, return redirect or whatever
}

这是有效的,因为Dictionary<int,bool>KeyValuePair<int,bool>的集合,.Key.Value输入字段将与.Key和{{1 } .Value的属性。

您可能需要阅读ASP.NET Wire Format for Model Binding to Arrays, Lists, Collections, Dictionaries