我在视图中定义了一个操作链接
@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")
}
答案 0 :(得分:2)
当HttpPost
生成ActionLink
请求时,您的操作会标有GET
属性。更准确地说,ActionLink
呈现一个锚标记,单击该标记时会向服务器发送GET
请求。
操作是否标有HttpPost
属性有什么特别的原因吗?您可能希望删除该属性或将其替换为HttpGet
属性。
如果是,由于某些原因,要求操作仅收听POST
请求,那么您可以使用单个按钮设置为链接,而不是使用ActionLink
。 / p>
@using(Html.BeginForm("MarkComplete", "Users")) {
<input type="hidden" name="id" value="@item.ID">
<input type="submit" value="Mark as Completed" />
}
但是你已经将整个表格包装在一个表单中,是的,表单不能嵌套,所以你需要更加戏剧性地更改视图。
因此整个视图可能如下所示:
@model IEnumerable<Base.Models.Task>
@{ ViewBag.Title = "UserTasks"; }
<h2>User</h2>
<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>
@using(Html.BeginForm("MarkComplete", "Users")) {
@Html.AntiForgeryToken()
<input type="hidden" name="id" value="@item.ID">
<input type="submit" value="Mark as Completed" />
}
</td>
</tr>
}
</table>
<div>
@Html.ActionLink("Back to List", "Index")
</div>
@section Scripts {
@Scripts.Render("~/bundles/jqueryval")
}
答案 1 :(得分:0)
用
替换ActionLink<input type="submit" value="Mark as Completed">
所以它会进行POST。
将Form的Action设置为ActionLink指向的位置。
https://weblogs.asp.net/scottgu/asp-net-mvc-framework-part-4-handling-form-edit-and-post-scenarios