0

我刚开始使用 WebGrid,我一直在寻找删除行的正确方法。

但我不想使用将用户重定向到另一个窗口的解决方案。我只希望当用户单击删除然后弹出一个确认窗口,如果用户选择是,删除数据并刷新页面,但使用 ajax。

我找到了一种方法来做到这一点,但我在互联网上还没有看到其他人以同样的方式这样做,我想知道将来遵循它是否是一个好习惯。

在 WebGrid 我有以下列定义:

grid.Column(header: "", format: @<text> <button  type="submit" name="Delete" value="@item.Id">Delete</button></text>)

它在 @Ajax.Beginform(...) { ... }

在我的控制器中,我检查是否单击了删除按钮并以这种方式获取 Id:

[HttpPost]
public ActionResult Index(ManageOvertimesViewModel model, FormCollection formCollection)
{
...
if (formCollection["Delete"] != null)
  {
  int id = int.Parse(formCollection["Delete"]);
  //Delete the data
  return PartialView("IndexPartial", model);
  }
...
}

当我在此视图中删除某些内容时,可以更改显示的其他数据,因此我需要发布 ViewModel 以在视图中重新创建一些 DropDowns,这就是我不使用 Ajax.ActionLink 解决删除问题的原因。

那么是不是实现删除的好方法呢?

4

2 回答 2

0

对于您的解决方案,Grid 必须位于 Ajax 表单内。ajax 表单将执行部分更新,而网格将执行(如果您指定一个 ajax 目标,如果您想避免页面重新加载,则必须这样做,至少如果您使用由 WebGrid 生成的分页器/排序标题进行分页和排序)。这就是我对类似解决方案感到头疼的地方。网格在排序或分页时开始出现奇怪的行为,例如,控制器被执行了多次。

我最终放弃了 WebGrid,现在我正在使用带有 razor 命令的 html 表格,它工作得很好并且提供了更好的控制。

除了最简单的演示,我建议不要使用 WebGrid。

除此之外,我认为您的方法没有问题,使用名称/值将数据传递给控制器​​对我有用。

于 2013-10-18T12:23:03.483 回答
0

这里有来自 View 的示例:

grid.Column("", "", canSort: false, format:@<b>@Html.ActionLink("Delete", "DeletePrizeRun", new { id = item.ID })</b>, style: "column")

这里来自控制器的代码:

public ActionResult DeletePrizeRun(int id)
{ 
    using (var context = new ExampleDataContext())
    {
        var prizeRun = context.PrizeRuns.FirstOrDefault(p => p.id == id);
        context.PrizeRuns.Remove(prizeRun);
        context.SaveChanges();
    }
}
于 2013-10-17T12:05:47.227 回答