2011-05-25 71 views
2

我有一個表中的「東西」的列表,並且每行中都有一個Details鏈接,它將在每個可見行下的隱藏行中加載項目的詳細信息,再次單擊鏈接將隱藏該項目的詳細信息。顯示/隱藏用簡單的jQuery完成fadeToggle()取消MVC基於條件的Ajax.Actionlink

當前細節鏈接是調用指定操作的Ajax.Actionlink()
一切工作正常,除了當我想隱藏細節,它再次調用操作,調用邏輯,調用數據庫。
顯然這是資源的浪費,所以我想要一種方式來取消ajax請求時滿足條件;條件是「細節」容器是可見的。

@Ajax.ActionLink("Details", "DetailsPartial", 
       new AjaxOptions { 
         OnBegin = "function(){ 
          checkLoaded('" + string.Format("DetailContainer{0}", item.Id) + "'); 
         }", 
       HttpMethod = "GET", 
       UpdateTargetId = string.Format("Detail{0}", item.Id), 
       OnSuccess = "function(){ 
           showElement('" + string.Format("DetailContainer{0}", item.Id) + "'); 
          }", 
       InsertionMode = InsertionMode.Replace 
       }) 

我懷疑我應該做與OnBegin的工作,但我還沒有發現魔術的命令取消Ajax調用。
隨着checkLoaded()函數,我正在檢查.css('display') == 'none'的傳遞元素ID,所以我需要在那裏取消。

我已經搜索了一段時間的解決方案,但找不到一個,也許是因爲我不知道如何去問它聰明。幫助表示讚賞。

回答

3

如果您想取消操作,您只需在OnBegin方法中返回false。

@Ajax.ActionLink("Details", "DetailsPartial", 
       new AjaxOptions { 
         OnBegin = "function(){ 
          return !checkLoaded('" + string.Format("DetailContainer{0}", item.Id) + "'); 
         }", 
       HttpMethod = "GET", 
       UpdateTargetId = string.Format("Detail{0}", item.Id), 
       OnSuccess = "function(){ 
           showElement('" + string.Format("DetailContainer{0}", item.Id) + "'); 
          }", 
       InsertionMode = InsertionMode.Replace 
       }) 
+0

你給了我一個新的視角,謝謝 – romeozor 2011-08-13 20:00:59

+2

似乎沒有工作。我打電話給確認對話框並返回結果。即使用戶選擇取消並返回false,操作仍然通過:( – Alex 2012-03-07 15:42:02

1

我面臨同樣的問題:即使先前答案的匿名函數返回false,也會執行AJAX請求。發生這種情況是因爲OnBegin的內容正在包裝到匿名函數中,並且如果此函數返回false,則會取消AJAX請求。這解決了我的問題:

... 
OnBegin = "return function(){ 
    return !checkLoaded('" + string.Format("DetailContainer{0}", item.Id) + "'); 
}", 
...