如何让Button更新数据库?

时间:2015-09-24 23:51:39

标签: c# asp.net-mvc button controller asp.net-mvc-5

我有一个View,在GridView中生成清单来执行项目。一个特定项目是状态。如果未完成该项目,则会显示一个按钮,将该项目标记为已完成,并标记单击该按钮的人员以及何时:

    <td>
        @if (item.status.Equals("Done"))
        {
            @Html.DisplayFor(modelItem => item.status)
        }
        else
        {
            <input type="button" title="TestTitle" value="TestValue" onclick="location.href='@Url.Action("Update", "Checklist", new { item = item})'" />
        }
    </td>

我从搭建的Edit中获取代码并在我的ChecklistController中稍微修改它,因为我想要做的就是在DB中修改三列:

[HttpPost]
[ValidateAntiForgeryToken]
public ActionResult Update([Bind(Include = "ID,ww,taskitem,owner,manager,project,status,applied_by,timestamp")] TaskItem taskItem)
{
    taskItem.timestamp = DateTime.UtcNow;
    taskItem.applied_by = System.Web.HttpContext.Current.User.Identity.Name;
    taskItem.status = "Done";

    if (ModelState.IsValid)
    {
        db.Entry(taskItem).State = EntityState.Modified;
        db.SaveChanges();
        return RedirectToAction("Index");
    }
    return View("Index", db.TaskItemSet.ToList());
}

我对绑定和匿名类型有点新,所以无论使用new { item = item}new { id = item.id}还是new {item},我都会得到:

  应用程序中的服务器错误。

     

无法找到资源。

     

描述:HTTP 404.您正在寻找的资源(或其中一个   依赖项)可能已被删除,其名称已更改,或者是   暂时不可用。请查看以下网址并制作   确保它拼写正确。

     

请求的网址:/核对清单/更新

     

版本信息:Microsoft .NET Framework版本:4.0.30319;   ASP.NET版本:4.6.81.0

我做错了什么,如何做我想做的事?

1 个答案:

答案 0 :(得分:2)

onclick="location.href='...'"正在对一个不存在的方法进行GET调用(你只有一个POST方法)。

将您的视图更改为包含具有相应状态的每个项目的表单

else
{
  using (Html.BeginForm("Update", "Checklist", new { id = item.ID }))
  {
    @Html.AntiForgeryToken()
    <input type="submit" title="TestTitle" value="TestValue" />
  }
}

并将控制器方法修改为

[HttpPost]
[ValidateAntiForgeryToken]
public ActionResult Update(int ID)
{
  // Get the model
  TaskItem model = db.TaskItems.Where(m => m.ID == ID).FirstOrDefault();
  // Update properties
  model.timestamp = DateTime.UtcNow;
  model.applied_by = System.Web.HttpContext.Current.User.Identity.Name;
  model.status = "Done";
  // Save and redirect
  db.Entry(model).State = EntityState.Modified;
  db.SaveChanges();
  return RedirectToAction("Index");
}

附注:如果这些按钮所在的视图是Index视图,那么通过使用ajax发布值然后只更新DOM以替换具有状态的按钮,您将获得更好的性能文本