【问题标题】:Asp.NET MVC AjaxOptions OnSuccess fires.. too early?Asp.NET MVC AjaxOptions OnSuccess 触发.. 为时过早?
【发布时间】:2010-11-15 02:48:24
【问题描述】:

一旦完全收到响应并更新 DOM,我想使用作为 Ajax.BeginForm 参数传递的 AjaxOptions 的 OnSuccess 选项来“做某事”。据我从 MSDN 可以理解,这就是这个选项的作用。

在我的应用程序中,OnSuccess 脚本在请求发送后立即触发太早。我让线程休眠了一段时间,以便更好地查看结果。我应该看到 OnSuccess 脚本(警报)在该睡眠时间之后触发,例如 2 秒。我使用 Firebug 来查看幕后发生的事情,我所看到的只是:我单击按钮(在 ajax 表单中提交),显示警报(比预期早 2 秒),2 秒后,firebug 显示请求响应,什么也没有更多的事情发生。

我哪里错了?

提前致谢, 吨

一些示例代码,如正确询问(我在 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>

家庭控制器

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

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

【问题讨论】:

  • 代码添加为(正确)询问!

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


【解决方案1】:

我一直在研究这个问题,似乎“开启”事件并不像看起来那样。

如果您阅读这篇文章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 的代码中找到

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

【讨论】:

  • 谢谢 Webmonger,我是 MVC 新手,但我有一些通过 JQuery 使用 Ajax 的经验:我会按照你的建议在 MVC 环境中最大限度地提高这种体验,只要我能理解这些世界可以一起生活得很好。
  • 我现在已经启动了几个 asp.net mvc 应用程序,我自己和我的开发人员都发现 jQuery 和 asp.net MVC 可以很好地协同工作。那里也有很多好的实践例子。 weblogs.asp.net/rashid/archive/2009/04/03/…
  • 见 Paul McCaskie 的回答......这是正确的。这是 jquery 或 javascript 的正常使用。如果你在 jquery 事件调用中做同样的事情,同样的事情会发生。你必须给它一个函数的名字或者用 function () { } 包装你的代码
【解决方案2】:

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

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

【讨论】:

  • 这是正确答案。您必须给出函数的名称或使用函数 () {} 包装代码。这是 jquery 中的标准。同样的事情发生在任何其他 jquery 事件分配中。
  • 只是为了确认,function() {} 有效,functionName 也有效,但 functionName(parameter) 无效
  • All "OnSuccess = "function() { alert('onsuccess failed'); }" " 对我来说是阻止加载微调器消失。
【解决方案3】:

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

【讨论】:

    【解决方案4】:

    调用类似函数

    函数显示警报(){ 警报(“你好世界”); }

    调用 Ajax 开始

    onSuccess="showAlert"

    没有括号

    【讨论】:

      【解决方案5】:

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

      【讨论】:

        猜你喜欢
        • 2018-09-21
        • 1970-01-01
        • 2010-10-16
        • 1970-01-01
        • 2011-02-06
        • 2017-11-01
        • 2019-10-17
        • 2012-11-29
        • 2018-05-02
        相关资源
        最近更新 更多