2010-02-13 61 views
2

我試圖使用鏈接使用下面的代碼提交表單:ASP.NET MVC提交窗體使用ActionLink的

function deleteItem(formId) { 

      // submit the form 

      $("#" + formId).submit(); 

     } 

基本上我有一個網格,它顯示了一些項目。每行都有一個刪除按鈕,刪除該項目。然後我觸發以下功能從網格中刪除項目。

function onItemDeleted(name) { 

      $("#" + name).remove();      

     } 

它工作正常,當我使用提交按鈕,但當我使用動作鏈接從控制器行動的JavaScript返回爲字符串,不執行。

public JavaScriptResult DeleteItem(string name) 
     { 
      var isAjaxRequest = Request.IsAjaxRequest(); 

      _stockService.Delete(name); 
      var script = String.Format("onItemDeleted('{0}')", name); 
      return JavaScript(script); 
     } 

這裏是HTML代碼:

<td> 

    <% using (Ajax.BeginForm("DeleteItem",null, new AjaxOptions() { LoadingElementId = "divLoading", UpdateTargetId = "divDisplay" },new { id="form_"+stock.Name })) 
     { %> 

    <%=Html.Hidden("name", stock.Name)%> 
    <a id="link_delete" href="#" onclick="deleteItem('form_ABC')">Delete</a> 

    <% } %> 

    </td> 

我的理論是,提交按鈕不會改變的響應,而操作鏈接直接返回無論是從控制器的行動返回。這意味着,在使用提交時,JavaScript被添加到響應中,然後在執行鏈接時執行,它僅作爲字符串返回。

如果是這種情況,怎麼可能有人使用動作鏈接而不是提交按鈕。

UPDATE:

好像我需要進行一些額外的東西,使操作鏈接的工作,因爲它不會觸發onsubmit事件。

http://www.devproconnections.com/article/aspnet22/posting-forms-the-ajax-way-in-asp-net-mvc.aspx

+0

我建議嘗試沒有Html幫手?我很擔心; MVC正在慢慢變成Webforms的邪惡雙胞胎。 – ziya

+0

HtmlHelpers爲了什麼?我正在使用沒有HtmlHelpers的鏈接。 – azamsharp

回答

1

我的猜測是MS Ajax表單知道如何處理JavaScriptResponse和而執行的代碼你簡單的舊操作鏈接,與AjaxForm沒有關係,不會。我很確定MS ajax庫本質上是eval(),當它看到javascript的內容類型被髮回時的響應。

由於您在deleteItem()方法中沒有回調,因此腳本沒有放置位置。要解決您的問題,您必須手動eval()返回的字符串,這被認爲是不好的做法。

現在我不熟悉MS Ajax庫是確定任何這些,但你做什麼是可能的。我會以不同的方式做事,但不想用「我的方式更好」的方法來回答(特別是因爲你的博客以前幫助過我),但我想表明這可以更容易。

我會完全放棄表單並使用不顯眼的JavaScript來獲得您想要的行爲。在僞jqueryish(不知道MS的ajax)代碼:

function bindMyGrid() { 
    $('.myDeleteLink').onclicksyntax(function() { 

     //find the td in the row which contains the name and get the text 
     var nameTdCell = this.findThisCellSibling(); 

     //do an ajax request to your controller 
     ajax('myUrl/' + nameTdCell.text(), function onSuccessCallback() { 

       //get the tr row of the name cell and remove it 
       nameTdCell.parent().remove();     
     }); 

    }); 
} 

這也收穫不是從你的控制器,它的一些考慮分手的擔憂MVC模式及分返回的JavaScript的好處。希望我的僞代碼有幫助。

+1

我結束了使用JQuery $ .get函數來執行Ajax請求。 – azamsharp

0

嘗試沒有在AjaxOptions的UpdateTargetId屬性(不指定它)

new AjaxOptions() { LoadingElementId = "divLoading" } 
+0

查看更新的帖子。 – azamsharp

0

如果只是改變一個標準或使用一些css類的外觀呢?它會看起來像一個鏈接,你會避免一些問題,你可以用錨點 - 用戶將能夠通過鼠標滾輪點擊它,並在新標籤頁/窗口中打開該鏈接。