ASP.NET MVC使用ActionLink提交表单

时间:2010-02-13 00:39:42

标签: asp.net asp.net-mvc

我正在尝试使用链接使用以下代码提交表单:

 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>

我的理论是提交按钮确实改变了响应,而动作链接只返回从控制器动作返回的任何内容。这意味着在使用submit时,JavaScript会被添加到响应中,然后执行,而在动作链接的情况下,它只是作为字符串返回。

如果是这种情况,有人可以使用操作链接而不是提交按钮。

更新:

似乎我需要执行额外的操作以使操作链接起作用,因为它不会触发onsubmit事件。

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

3 个答案:

答案 0 :(得分:1)

我的猜测是MS Ajax表单知道如何处理JavaScriptResponse并执行代码,而您的普通旧Action链接与AjaxForm没有任何关系。我很确定MS ajax库本质上是eval()的响应,当它看到javascript的内容类型被发回时。

由于您的deleteItem()方法中没有回调,因此脚本没有位置。要修复你必须手动eval()发回的字符串,这被认为是一种不好的做法。

现在我不熟悉MS Ajax库以确定其中的任何一个,但您可以做的事情。我会采取不同的做法,但不想以“我的方式更好”的方式回答(特别是因为你的博客曾经帮助过我),但我想表明这可以更容易。

我完全抛弃了表单并使用不引人注目的javascript来获得你想要的行为。 IN psuedo 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();                 
         });

    });
}

这也可以获得不从您的控制器返回javascript的好处,有些人会考虑打破MVC模式和分离关注点。希望我的伪代码有所帮助。

答案 1 :(得分:0)

尝试不使用AjaxOptions中的UpdateTargetId属性(不要指定它)

new AjaxOptions() { LoadingElementId = "divLoading" }

答案 2 :(得分:0)

如何改变标准的外观或使用某些css类?它看起来像一个链接,你可以避免使用锚点遇到的一些问题 - 用户可以通过鼠标滚轮点击它并在新的标签/窗口中打开该链接。