2014-05-04 87 views
0

我有麻煩執行ajaxified HttpPost操作方法。 ActionMethod Publish中的斷點甚至不會觸發,此方法的Html版本返回:無法找到資源(404)。控制器的名稱沒問題,登錄用戶的角色沒問題,PartialView存在。什麼可能是一個原因?ActionMind無法找到ActionLink - ajax.ActionLink()

這是一個觀點:

<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正常工作。但是在這種形式下,這個操作將是不安全的(更新數據庫字段)。如何編寫並維護安全規則?

+0

確保你有'jquery.unobtrusive-ajax.js'引用。另外,請嘗試刪除'AntiForgeryToken'。您無法真正將它與'Ajax.ActionLink'一起使用。你需要使用一個常規的'ActionLink'和一些JavaScript來獲取僞造令牌,並將其與'POST'請求​​放在一起。 –

回答

0

據我所知,您不能將AntiForgeryToken和Ajax.ActionLink一起使用。您需要使用一些javascript解析僞造標記並將其附加到您的發佈請求中。

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

如果你不希望出現這種情況,刪除僞造令牌。還要確保你使用的是jquery.unobtrusive-ajax.js

+0

不幸的不是。我引用了jquery.unobtrusive-ajax.js。嘗試沒有AntiForgeryToken的呼叫,但仍然無效。這似乎是與視圖和控制器之間的通信,因爲'發佈'行動方法甚至沒有開始(如我上面提到的 - 斷點沒有被解僱,並返回錯誤404)... – magos