HttpPost不会被称为

时间:2018-04-13 01:36:02

标签: c# asp.net asp.net-mvc asp.net-mvc-routing

我现在已经在这一小时了一个小时,我还没有弄清楚我做错了什么。

我收到了以下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 }
        );
    }
}
}

3 个答案:

答案 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方法。我希望这会有所帮助。