【问题标题】:ActionMethod cannot be found by ActionLink - ajax.ActionLink()ActionLink 找不到 ActionMethod - ajax.ActionLink()
【发布时间】:2014-06-20 19:59:23
【问题描述】:

我在执行 ajaxified HttpPost 操作方法时遇到了问题。 ActionMethod Publish 中的断点甚至没有触发,此方法的 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 可以正常工作。但在这种情况下,此操作将是不安全的(更新数据库字段)。如何编写和维护安全规则?

【问题讨论】:

  • 确保您引用了jquery.unobtrusive-ajax.js。另外,请尝试删除AntiForgeryToken。你不能真正将它与Ajax.ActionLink 一起使用。您需要使用常规的 ActionLink 和一些 javascript 来获取伪造令牌并将其与 POST 请求一起使用。

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


【解决方案1】:

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

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

如果您不想这样做,请移除伪造令牌。还要确保您使用的是jquery.unobtrusive-ajax.js

【讨论】:

  • 很遗憾没有。我已经引用了 jquery.unobtrusive-ajax.js。在没有 AntiForgeryToken 的情况下尝试调用,但仍然无法正常工作。这似乎是视图和控制器之间的通信,因为甚至没有启动“发布”操作方法(正如我上面提到的 - 没有触发断点并返回错误 404)......
猜你喜欢
  • 1970-01-01
  • 2011-03-03
  • 2011-12-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-15
  • 2011-03-05
  • 2014-11-25
相关资源
最近更新 更多