ActionLink无法找到ActionMethod - ajax.ActionLink()

时间:2014-05-04 13:31:54

标签: asp.net-mvc asp.net-ajax

我在执行ajaxified HttpPost操作方法时遇到了麻烦。 ActionMethod发布中的断点甚至不会触发,此方法的Html版本返回:无法找到资源(404)。控制器的名称没问题,登录用户的角色没问题,PartialView存在。可能是什么原因?

这是一个观点:

<div id="info"></div>


    @if (User.IsInRole("admin") && item.IsPublished == false)
    {
        <p>
            @Ajax.ActionLink("Publish", "Publish", new { id = item.RecommendationID }, new AjaxOptions() { Confirm="Are you sure?", HttpMethod="POST", UpdateTargetId="info" })
        </p>
    }

这是行动方法:

    [HttpPost]
    [Authorize(Roles = "admin")]
    [ValidateAntiForgeryToken]
    public ActionResult Publish(int? id) 
    {
        if (id == null)
        {
            return new HttpStatusCodeResult(HttpStatusCode.BadRequest);
        }

        Recommendation recommendation = db.Recommendations.Find(id);

        if (recommendation == null)
        {
            return HttpNotFound();
        }

        recommendation.IsPublished = true;
        db.SaveChanges();

        return PartialView("RecommendationPublished");
    }

编辑:好的 - 现在我知道HttpPost属性导致了我的问题 - HttpGet正常工作。但在这种形式下,此操作将不安全(更新数据库字段)。如何编写并维护安全规则?

1 个答案:

答案 0 :(得分:0)

据我所知,您不能将AntiForgeryToken与Ajax.ActionLink一起使用。您需要使用一些javascript解析伪造令牌并将其附加到您的帖子请求中。

How to include the @Html.AntiForgeryToken() when deleting an object using a Delete link

如果您不想这样,请删除伪造令牌。另外请确保您使用的是jquery.unobtrusive-ajax.js