C# ActionLink未调用控制器
我在视图中定义了一个动作链接C# ActionLink未调用控制器,c#,asp.net-mvc,razor,C#,Asp.net Mvc,Razor,我在视图中定义了一个动作链接 @Html.ActionLink("Mark as Completed", "MarkComplete", new { id = item.ID }) 但是,这不会调用控制器中的方法,而是调用它生成以下链接的链接 我有什么遗漏吗 全视图代码 @model IEnumerable<Base.Models.Task> @{ ViewBag.Title = "UserTasks"; } <h2>User</h2> @u
@Html.ActionLink("Mark as Completed", "MarkComplete", new { id = item.ID })
但是,这不会调用控制器中的方法,而是调用它生成以下链接的链接
我有什么遗漏吗
全视图代码
@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")
}
@model IEnumerable@{
ViewBag.Title=“UserTasks”;}
使用者
@使用(Html.BeginForm()){
@Html.AntiForgeryToken()
用户任务
名称
细节
开始日期
到期日
@foreach(模型中的var项目){
@项目名称
@项目.详情
@item.StartDate.ToShortDateString()文件
@item.EndDate.ToShortDateString()的
@ActionLink(“标记为已完成”,“标记完成”,新的{id=item.id})
}
}
@ActionLink(“返回列表”、“索引”)
@节脚本{
@Scripts.Render(“~/bundles/jqueryval”)
}
您的操作被标记为HttpPost
属性,而ActionLink
生成GET
请求。更准确地说,ActionLink
呈现一个锚定标记,单击该锚定标记会向服务器发送一个GET
请求
操作标记为HttpPost
属性有什么特殊原因吗?您可能希望删除该属性或用HttpGet
属性替换它
如果出于某些原因,要求操作仅侦听POST
请求,那么您可以使用带有单个按钮样式的表单,而不是使用ActionLink
@using(Html.BeginForm("MarkComplete", "Users")) {
<input type="hidden" name="id" value="@item.ID">
<input type="submit" value="Mark as Completed" />
}
@使用(Html.BeginForm(“MarkComplete”、“Users”)){
}
但是,您已经将整个表包装在一个表单中,是的,表单不能嵌套,因此您需要更显著地更改视图
因此,整个视图可能如下所示:
@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")
}
@model IEnumerable
@{ViewBag.Title=“UserTasks”;}
使用者
用户任务
名称
细节
开始日期
到期日
@foreach(模型中的var项目){
@项目名称
@项目.详情
@item.StartDate.ToShortDateString()文件
@item.EndDate.ToShortDateString()的
@使用(Html.BeginForm(“MarkComplete”、“Users”)){
@Html.AntiForgeryToken()
}
}
@ActionLink(“返回列表”、“索引”)
@节脚本{
@Scripts.Render(“~/bundles/jqueryval”)
}
您的操作被标记为HttpPost
属性,而ActionLink
生成GET
请求。更准确地说,ActionLink
呈现一个锚定标记,单击该锚定标记会向服务器发送一个GET
请求
操作标记为HttpPost
属性有什么特殊原因吗?您可能希望删除该属性或用HttpGet
属性替换它
如果出于某些原因,要求操作仅侦听POST
请求,那么您可以使用带有单个按钮样式的表单,而不是使用ActionLink
@using(Html.BeginForm("MarkComplete", "Users")) {
<input type="hidden" name="id" value="@item.ID">
<input type="submit" value="Mark as Completed" />
}
@使用(Html.BeginForm(“MarkComplete”、“Users”)){
}
但是,您已经将整个表包装在一个表单中,是的,表单不能嵌套,因此您需要更显著地更改视图
因此,整个视图可能如下所示:
@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")
}
@model IEnumerable
@{ViewBag.Title=“UserTasks”;}
使用者
用户任务
名称
细节
开始日期
到期日
@foreach(模型中的var项目){
@项目名称
@项目.详情
@item.StartDate.ToShortDateString()文件
@item.EndDate.ToShortDateString()的
@使用(Html.BeginForm(“MarkComplete”、“Users”)){
@Html.AntiForgeryToken()
}
}
@ActionLink(“返回列表”、“索引”)
@节脚本{
@Scripts.Render(“~/bundles/jqueryval”)
}
将ActionLink替换为
<input type="submit" value="Mark as Completed">
所以它有一个帖子
将表单的操作设置为ActionLink指向的位置
将ActionLink替换为
<input type="submit" value="Mark as Completed">
所以它有一个帖子
将表单的操作设置为ActionLink指向的位置
删除
[HttpPost]
属性(链接生成GET,而不是POST)。Vut因为您的方法正在更改数据-它应该是一篇文章,并且在视图中使用表单。如果(ModelState.IsValid){-您没有绑定到模型,因此它总是true
删除现有表单,并且对于每个项目,使用@using(Html.BeginForm(“MarkComplete”,“yourController”,new{id=item.id})){@Html.AntiForgeryToken()删除[HttpPost]
属性(链接生成GET,而不是POST)。Vut因为您的方法正在更改数据-它应该是POST,并且在视图中使用表单。如果(ModelState.IsValid){
,您也可以删除-您没有绑定到模型,因此它总是true
删除现有表单,并且对于每个项目,使用@using(Html.BeginForm(“MarkComplete”),“yourController”,新的{id=item.id})){@Html.AntiForgeryT