即使Ajax.actionlink没有执行& sundsfully,也会执行eOnSuccess。如果使用firefox,OnSuccess也不会显示警报

时间:2012-03-10 02:26:39

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

我有以下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会调用folloiwng动作方法: -

[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脚本将被执行,但它没有,而是引发了一个null异常。

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

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

      

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

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

      

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

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

    再次感谢你的帮助..

1 个答案:

答案 0 :(得分:1)

  

1)如果我使用firefox web浏览器删除一个对象,那么   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确认框而不是   确认=“您确定要删除此答案吗?”

当然,只需使用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;
}