我正在尝试使用链接使用以下代码提交表单:
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
答案 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类?它看起来像一个链接,你可以避免使用锚点遇到的一些问题 - 用户可以通过鼠标滚轮点击它并在新的标签/窗口中打开该链接。