我现在已经在这一小时了一个小时,我还没有弄清楚我做错了什么。
我收到了以下ActionLink
:
@Html.ActionLink("Remove", "RemoveActivity", "Dashboard", new { id = a.Id },htmlAttributes: null)
这针对DashboardController
中的以下方法:
[HttpPost]
public ActionResult RemoveActivity(int id)
{
activityRepo.Delete(activityRepo.GetById(id));
return RedirectToAction("ActivityDetails");
}
由于某种原因,会返回此错误:
无法找到资源。描述:HTTP 404.资源你 正在寻找(或其中一个依赖)可能已被删除, 更改名称,或暂时不可用。请查阅 以下URL并确保拼写正确。 请求的URL:/ Dashboard / RemoveActivity / 564
数据库中确实存在ID为564的表行。几个小时前就有用了。 任何帮助表示赞赏。我很无能为力!
编辑:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;
using System.Web.Routing;
namespace HaarlemFestival_Web
{
public class RouteConfig
{
public static void RegisterRoutes(RouteCollection routes)
{
routes.IgnoreRoute("{resource}.axd/{*pathInfo}");
routes.MapRoute(
name: "Default",
url: "{controller}/{action}/{id}",
defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional }
);
}
}
}
答案 0 :(得分:2)
@Html.ActionLink()
生成一个<a>
标记,用于进行GET,而不是POST。您需要包含<form>
元素并将值提交到POST方法
@using (Html.BeginForm("RemoveActivity", "Dashboard", new { id = a.Id }))
{
<input type="submit value="Remove" />
}
您可以将提交按钮设置为看起来像链接,如果这是您想要的视觉
我还建议您在@Html.AntiForgeryToken()
中添加<form>
方法,并在您的方法中添加[ValidateAntiForgeryToken]
属性,以防止CSRF攻击。
您还应该考虑验证当前用户是否有权删除该记录。
请注意,由于您的方法正在更改数据,因此它应该是一个POST,因此不要只想从您的方法中删除[HttpPost]
attribte,以便链接正常工作。
答案 1 :(得分:1)
因为@ Html.ActionLink将呈现一个锚标记,点击它总是&#34; GET&#34;请求。因此,如果你想要一个HTTP-Post方法,你需要使用这样的javascript覆盖它的行为:
@Html.ActionLink("Remove", "RemoveActivity", "Dashboard", new { id = a.Id ,@class="post_link"},htmlAttributes: null);
[HttpPost]
public String RemoveActivity(int id)
{
activityRepo.Delete(activityRepo.GetById(id));
return "Remove/ActivityDetails";
}
<script type="text/javascript">
$(function(){
$("a.post_link").click(function(e){
e.preventDefault();
$.post($(this).attr("href"),function(data){
//got your redirection link and do a redirection request at here
window.location = data;
});
});
});
</script>
答案 2 :(得分:0)
你可以尝试这个,非常简单的方式
在你看来,只需放置锚标签://确保你有ID来这里
<a href="#" onclick="RemoveActivity(@a.Id)">Remove</a>
Jquery块:
<script type="text/javascript">
function RemoveActivity(index) {
var urlBase = '/Dashboard/RemoveActivity/';
$.ajax({
url: urlBase,
data: { id: index },
success: function (result) {
},
error: function (ex) {
}
});
}
</script>
仅将控制器操作保留为post方法。我希望这会有所帮助。