我在视图中定义的操作链接ActionLink的不是呼叫控制器
@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);
}
我在这里丢失的任何东西
Full Vi EW代码
@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)。因为你的方法正在改变数据 - 它应该是一个POST,并且在视图中使用一个表单。你也可以删除'if(ModelState.IsValid){' - 你不绑定到模型,所以它总是'真' –
删除现有的表单,并为每个项目,使用@using(Html.BeginForm(“MarkComplete” ,“yourController”,new {id = item.ID})){@ Html.AntiForgeryToken()}'也考虑使用ajax,以便用户可以继续 –