Asp.NET MVC AjaxOptions OnSuccess触发过早?

11
我想使用作为Ajax.BeginForm参数传递的AjaxOptions的OnSuccess选项,在响应完全接收并更新DOM后“做某事”。据我从MSDN理解,这就是此选项所执行的操作。
在我的应用程序中,OnSuccess脚本太早地触发,即在请求发送后立即触发。我将线程休眠一段时间,以更好地查看结果。我希望在休眠时间(比如2秒)之后看到OnSuccess脚本(一个警报)被触发。我使用Firebug查看了底层发生了什么,但我看到的只有:我单击按钮(ajax表单中的提交),警报显示出来(比预期提前2秒),2秒后firebug显示请求-响应,然后什么都没有发生。
我错在哪里?
谢谢, mt
如要求所述,以下是一些示例代码(我在VS中使用Asp.NET MVC模板开始了一个空白新解决方案):
Home/Index视图:
<asp:Content ID="indexContent" ContentPlaceHolderID="MainContent" runat="server">
<div id="divPlaceholder">
<% 
    using (Ajax.BeginForm("DoLongTask", "Home", 
    new AjaxOptions() {
        UpdateTargetId = "divPlaceholder", 
        InsertionMode = InsertionMode.Replace,
        OnSuccess = "alert('onsuccess fired')"
    })) 
{
%>
<input type="submit" value="button" />
<% } %>
</div>
</asp:Content>

HomeController

public ActionResult DoLongTask()
{
    if (Request.IsAjaxRequest())
    {
        System.Threading.Thread.Sleep(2000);
        return View();
    }
    else
    {
        throw new NotSupportedException();
    }
}

我认为这足以重现该行为。可以使用空的部分视图作为DoLongTask视图。


代码已按照要求(正确地)添加! - ccalboni
5个回答

24

我不确定这个答案是否有帮助,但是我目前正在尝试类似的操作,并发现如果你在OnSuccess中调用一个函数,那么它将在操作方法之后执行,例如:

using (Ajax.BeginForm("DoLongTask", "Home", 
    new AjaxOptions() {
        UpdateTargetId = "divPlaceholder", 
        InsertionMode = InsertionMode.Replace,
        OnSuccess = "function() { alert('onsuccess fired'); }"
    })) 

4
这是正确的答案。你需要给出一个函数的名称或者用一个函数(){}来包裹代码。这在jquery中很常见,在其他任何jquery事件赋值中也是如此。 - Edyn
1
只是确认一下,function() {} 可以使用,functionName 也可以,但 functionName(parameter) 不行。 - Arkiliknam
所有的"OnSuccess = "function() { alert('onsuccess fired'); }"对我来说只是阻止了加载旋转图标消失。 - Ian Warburton

10

我一直在研究这个问题,似乎“On”事件并不完全符合它们表面的意思。

如果你阅读这篇文章 How is OnSuccess measured for a ASP.NET MVC ActionLink?,你会看到womp说即使控制器中发生了什么事情,这些事件也可能会被触发。我也通过将所有“On”事件添加到AjaxOptions对象中进行的测试发现了这一点:

new AjaxOptions()
 {
     UpdateTargetId = "divPlaceholder",
     InsertionMode = InsertionMode.Replace,
     OnSuccess = "alert('OnSuccess')",
     OnBegin = "alert('OnBegin')",
     OnComplete = "alert('OnComplete')",
     OnFailure = "alert('OnFailure')"

 }

我在我的任何生产代码中都没有使用过AjaxOptions,但是我已经成功地使用了jQuery Ajax调用,并且事件在正确的时间触发。

关于ASP.net MVC和jQuery Ajax的教程可以在这里找到,一些如何使用事件的示例代码可以在此问题上找到。

很抱歉我无法解决你的问题,但希望这个替代方案能够有所帮助。


谢谢Webmonger,我对MVC还不熟悉,但我有一些使用JQuery的Ajax经验:我会遵循您的建议,在MVC环境中最大化利用这种经验,据我所知,这两个世界可以相互兼容。 - ccalboni
我已经推出了几个asp.net mvc应用程序,我和我的开发人员都发现jQuery和asp.net MVC非常契合。此外,有很多好的最佳实践示例可供参考。http://weblogs.asp.net/rashid/archive/2009/04/03/asp-net-mvc-best-practices-part-2.aspx#jQuery - Webmonger
1
看看Paul McCaskie的答案...那是正确的。这是jQuery或JavaScript的正常用法。如果你在jQuery事件调用中做同样的事情,同样的事情会发生。你必须给它一个函数的名字或者用function(){}包装你的代码。 - Edyn

4

OnSuccess是一个属性,它接受函数的名称或函数本身,就像上面的例子一样(不是任何语句)。AjaxOptions回调提供的名称的方法,在成功、失败等后执行。希望这可以帮助。


1

调用一个函数

function showAlert(){ alert("Hello World"); }

在Ajax开始时调用

onSuccess="showAlert"

不要加括号


1

刚刚测试了MVC 3中的OnSuccess回调函数,看起来已经修复了。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接