eOnSuccess будет выполняться, даже если Ajax.actionlink не был успешно выполнен, а также OnSuccess не будет отображать предупреждения при использовании Firefox - PullRequest
1 голос
/ 10 марта 2012

У меня есть следующая ссылка ajax.action, которая отвечает за удаление объектов ответа: -

    <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 будет выполнен, но он этого не сделал, скорее возникла исключительная ситуация.

  3. Есть ли способ предоставить окно подтверждения jquery вместо Confirm = "Are You sure You want to delete this Answer ?", BR

* Редактировать: - * большое спасибо за ваш подробный ответ, но у меня есть следующие моменты, которые необходимо уточнить: -

В вашем действии Удалить контроллер вы возвращаете пустой контент (вернуть Content ("")), и все же вы определили UpdateTargetId = @ answer.AnswersID.ToString () в вашей ссылке, которая заставляет FireFox ошибка, потому что вы не можете вставить пустой контент в DOM

Я возвращаю пустую строку из метода действия, потому что мне не нужно ничего отображать пользователю после удаления, так как я удаляю удаленный объект из DOM, используя $ (this).remove();, так что должно быть частичным представлением _foo содержится в этом случае?

Если, с другой стороны, вы обрабатываете это исключение на сервере и использовать его, не передавая его, и возвращать статус HTTP 200 код

но в моем случае метод действия не обрабатывает исключение нулевого указателя, но, с другой стороны, при возникновении исключения нулевого указателя Ajax.Actionlink onFailure не будет выполняться !!.

Еще раз спасибо за вашу помощь ..

1 Ответ

1 голос
/ 10 марта 2012

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 будет выполнен, но он это сделалнет, скорее возникло нулевое исключение.

Если на стороне сервера выдается исключение и возвращается код состояния HTTP 500, будет вызван обратный вызов OnFailure.Если, с другой стороны, вы обрабатываете это исключение на сервере и используете его, не передавая его для распространения и возвращая код состояния HTTP 200, это будет обратный вызов 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;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...