【问题标题】:eOnSuccess will be executed even if the Ajax.actionlink did not succsfully execute & also the OnSuccess will not display alerts if using firefox即使 Ajax.actionlink 没有成功执行,eOnSuccess 也会执行,如果使用 firefox,OnSuccess 也不会显示警报
【发布时间】:2012-03-27 10:57:25
【问题描述】:

我有以下负责删除答案对象的 ajax.actionlink:-

    <td>
             @Ajax.ActionLink("Delete", "Delete", "Answer",
            new { id = answer.AnswersID },
              new AjaxOptions
              {

                  Confirm = "Are You sure You want to delete this Answer ?",
                  HttpMethod = "Post",
                  UpdateTargetId = @answer.AnswersID.ToString(),
                  OnSuccess = "deleteconfirmation",
OnFailure = "deletionerror"
              })


        </td>

以及以下 deleteconfirmation.js :-

function deleteconfirmation() {
    jAlert('The Answer was deleted succsfully', 'Deletion Confirmation');
        $(this).remove();
}

如果 ajax.actionlink 将调用以下操作方法:-

[HttpPost]
        public ActionResult Delete(int id)
        {
            var a = repository.FindAnswer(id);

            repository.DeleteAnswer(a);
            repository.Save();
            return Content("");
assessments.");
        }

但我面临以下问题:-

  1. 如果我用firefox浏览器删除了一个对象,jAlert('The Answer was deleted succsfully', 'Deletion Confirmation');不会显示,而用IE会显示,请问是什么原因?

  2. 我浏览到显示答案对象的预期网页,然后我从数据库中手动删除答案对象,然后单击已删除对象后面的删除 ajax 链接(刷新页面之前),所以我期待 onfailure 脚本将被执行,但它没有,而是引发了一个空异常。

  3. 有没有办法提供一个 jquery 确认框而不是 Confirm = "Are You sure You want to delete this Answer ?", BR

*编辑:- * 非常感谢您的详细回答,但我有以下几点需要澄清:-

在您的删除控制器操作中,您将返回一个空内容 (return Content("")) 但您已经定义了一个 UpdateTargetId = @answer.AnswersID.ToString() 在您的链接中,这使 FireFox 抛出 错误,因为您无法在 DOM 中插入空内容

我从操作方法返回一个空字符串,因为删除后我不需要向用户显示任何内容,因为我正在使用 $(this).remove(); 从 DOM 中删除已删除的对象,所以部分视图应该是什么@ 987654327@ 在这种情况下包含?

另一方面,如果您在服务器上处理此异常并且 使用它而不离开它传播并返回 200 HTTP 状态 代码

但在我的情况下,action 方法没有处理空指针异常,但另一方面,如果引发空指针异常,则不会执行 Ajax.Actionlink onFailure!。

再次感谢您的帮助..

【问题讨论】:

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


    【解决方案1】:

    1) 如果我使用 firefox 网络浏览器删除一个对象,那么 jAlert('答案已成功删除', '删除确认'); 不会显示,但会使用 IE 显示,所以可能是什么 原因?

    在您的 Delete 控制器操作中,您正在返回一个空内容 (return Content("")),但您在链接中定义了一个 UpdateTargetId = @answer.AnswersID.ToString(),这会使 FireFox 抛出错误,因为您无法将空内容插入 DOM -这没有任何意义。我猜 IE 对这种错误的容忍度更高一些。我猜在 IE 中,虽然您没有收到错误,但给定的 DOM 元素在删除后根本不会刷新。

    因此,您必须从删除控制器操作中返回一些实际内容,例如部分视图:

    [HttpPost]
    public ActionResult Delete(int id)
    {
        var a = repository.FindAnswer(id);
        repository.DeleteAnswer(a);
        repository.Save();
        return PartialView("_Foo");
    }
    

    现在这个局部视图的内容将用于刷新给定的 DOM 元素。

    2) 我浏览到显示答案对象的预期网页,然后 我从数据库中手动删除答案对象,之后我 单击已删除对象后面的删除 ajax 链接(之前 刷新页面),所以我期待 onfailure 脚本 将被执行但它没有被执行,而是引发了一个空异常。

    如果在您的服务器端引发异常并返回 500 HTTP 状态代码,则将调用 OnFailure 回调。另一方面,如果您在服务器上处理此异常并使用它而不让它传播并返回 200 HTTP 状态代码,那么即使服务器上出现错误,它也会执行 OnSuccess 回调。

    3) 有没有办法提供一个 jquery 确认框而不是 Confirm = "您确定要删除此答案吗?"

    当然,只需使用OnBegin 而不是Confirm

    @Ajax.ActionLink(
        "Delete", 
        "Delete", 
        "Answer",
        new { id =  answer.AnswersID },
        new AjaxOptions
        {
            HttpMethod = "Post",
            UpdateTargetId = answer.AnswersID.ToString(),
            OnBegin = "deletebegin",
            OnSuccess = "deleteconfirmation",
            OnFailure = "deletionerror"
        }
    )
    

    在您的deletebegin 回调中:

    function deletebegin() {
        // Show whatever confirmation you want here and return true
        // to proceed with the AJAX request and false to cancel it.
    
        // As an example I am using the standard confirm js method but
        // you could really use whatever you like
    
        var shouldProceed = confirm('Are You sure You want to delete this Answer ?');
    
        return shouldProceed;
    }
    

    【讨论】:

    • 感谢您的回复,问题是 OnBegin 不能作为 Confirm;因为 ObBegin 脚本将在执行的同时执行,无论天气如何,对象都会从 DOM 中删除和移除,因此用户选择“确定”或“取消”......
    • @johnG,OnBegin 回调在 AJAX 调用之前执行。如果您从中返回 false,则不会执行 AJAX 调用。并且只有在 AJAX 调用成功后,DOM 才会更新。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-11-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-04-20
    • 1970-01-01
    相关资源
    最近更新 更多