【发布时间】:2016-07-15 20:59:08
【问题描述】:
我的视图中定义了一个操作链接
@Html.ActionLink("Mark as Completed", "MarkComplete", new { id = item.ID })
但是这不会调用我的控制器中的方法,而是它产生以下链接的链接
http://localhost:52069/Users/MarkComplete/3
[HttpPost]
public ActionResult MarkComplete(int? id) {
if (id == null) {
return new HttpStatusCodeResult(HttpStatusCode.BadRequest);
}
Task task = db.Tasks.Find(id);
if (task == null) {
return HttpNotFound();
}
if (ModelState.IsValid) {
task.Completed = 1;
db.Entry(task).State = EntityState.Modified;
db.SaveChanges();
return RedirectToAction("Index");
}
return View(task);
}
我在这里缺少的任何东西
完整查看代码
@model IEnumerable<Base.Models.Task> @{
ViewBag.Title = "UserTasks"; }
<h2>User</h2>
@using (Html.BeginForm()) {
@Html.AntiForgeryToken()
<h4>Task for User</h4>
<table class="table">
<tr>
<th>
Name
</th>
<th>
Details
</th>
<th>
Start Date
</th>
<th>
Due Date
</th>
</tr>
@foreach (var item in Model) {
<tr>
<td>@item.Name </td>
<td>@item.Details</td>
<td>@item.StartDate.ToShortDateString()</td>
<td>@item.EndDate.ToShortDateString()</td>
<td>
@Html.ActionLink("Mark as Completed", "MarkComplete", new { id = item.ID })
</td>
</tr>
}
</table>
}
<div>
@Html.ActionLink("Back to List", "Index")
</div>
@section Scripts {
@Scripts.Render("~/bundles/jqueryval")
}
【问题讨论】:
-
删除
[HttpPost]属性(链接生成 GET,而不是 POST)。 Vut 因为您的方法正在更改数据 - 它应该是一个 POST,并且在视图中使用一个表单。你也可以删除if (ModelState.IsValid) {- 你没有绑定到模型,所以它总是true -
删除现有表单,并为每个项目使用
@using (Html.BeginForm("MarkComplete", "yourController", new { id = item.ID })) { @Html.AntiForgeryToken() <input type="submit value="Mark as Completed" /> }。还可以考虑使用 ajax,这样用户就可以留在页面上并继续“标记为已完成”其他项目。
标签: c# asp.net-mvc razor