2010-02-13 60 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类的外观呢?它会看起来像一个链接,你会避免一些问题,你可以用锚点 - 用户将能够通过鼠标滚轮点击它,并在新标签页/窗口中打开该链接。