Asp.NET MVC AjaxOptions OnSuccess太火了......太早了?

时间:2009-07-29 15:06:49

标签: asp.net-mvc asp.net-ajax

一旦响应被完全接收并且DOM更新,我想使用AjaxOptions的OnSuccess选项作为Ajax.BeginForm参数传递给“做某事”。至于我可以从MSDN中找不到,这就是这个选项的作用。

在我的应用程序中,OnSuccess脚本在发送请求后立即过早触发。我让线程睡了一会儿,以便更好地看到结果。我应该看到OnSuccess脚本(一个警报)在那个睡眠时间之后被触发,比如2秒。我使用Firebug来查看引擎盖下发生了什么,我看到的只是:我点击按钮(在ajax表单内提交),显示警报(预期前2秒),2秒后firebug显示请求 - 响应,没有更多的事情发生了。

我哪里错了?

提前致谢, MT

一些示例代码,正确的问题(我在VS中使用Asp.NET MVC模板启动了一个空白的新解决方案):

主页/索引视图:

<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视图。

5 个答案:

答案 0 :(得分:24)

不确定这会有多大帮助但我现在正在考虑做这样的事情并且发现如果你在OnSucess中调用一个函数然后它会在action方法之后发生,例如:

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

答案 1 :(得分: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的教程here,有关如何使用事件的一些示例可以在this question上的代码中找到

抱歉,我无法解决您的问题,但我希望这种替代方案有所帮助。

答案 2 :(得分:4)

OnSuccess是一个属性,它采用上述情况中的函数或函数的名称(不是任何语句)。并且AjaxOptions回调提供名称的方法,成功后失败,...希望这有帮助

答案 3 :(得分:1)

调用类似

的函数 function showAlert(){    警报(“Hello World”); }

调用Ajax Begin

的onSuccess = “showAlert”

没有括号

答案 4 :(得分:1)

刚刚测试了MVC 3中的OnSuccess回调,它似乎已修复。

相关问题