【发布时间】: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请求一起使用。