【问题标题】:How to get Button to Update Database?如何获取更新数据库的按钮?
【发布时间】:2015-09-24 23:51:38
【问题描述】:

我有一个视图,其中在 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>

我从脚手架编辑中获取代码,并在我的 ChecklistController 中稍微修改它,因为我想要做的就是修改数据库中的三列:

[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。您正在寻找的资源(或其之一 依赖项)可能已被删除,名称已更改,或者是 暂时不可用。请查看以下 URL 并制作 确保拼写正确。

请求的 URL:/Checklist/Update

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

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

【问题讨论】:

  • location.href 进行 GET 调用。您需要为每个项目创建一个表单(它应该只发回对象的 ID,而不是完整的模型)
  • @StephenMuecke 我认为您应该将其发布为答案)

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


【解决方案1】:

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 以将按钮替换为状态文本,您将获得更好的性能

【讨论】:

  • 使用前的@需要去掉,否则效果很好。感谢您的解释;在我将核心功能用作概念证明之后,我将研究 ajax,但是从用户的角度来看,让 DOM 用文本替换按钮会更好,而不是基本上导致页面刷新。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-01-17
  • 1970-01-01
  • 2020-07-13
  • 1970-01-01
  • 2021-04-14
相关资源
最近更新 更多