Ajax.BeginForm с OnComplete всегда обновляет страницу

У меня простая форма ajax в MVC. В AjaxOptions для OnComplete задана простая функция javascript, которая делает одно - возвращает false.

@using (Ajax.BeginForm("Action", "Controller", new AjaxOptions { UpdateTargetId = "DivFormId", HttpMethod = "Post", OnComplete = "preventUpdate" }))

function preventUpdate(xhr) {
    return false;       
}

Проблема в том, что эта страница уже обновлена. Например. в одном случае контроллер возвращает частичное представление после обратной передачи, в другом случае он возвращает некоторый объект Json. Я хочу, чтобы он обновлял страницу при возврате частичного представления и отображал диалоговое окно при возврате json. К сожалению, когда возвращается json, он очищает страницу (обновляет ее с помощью json), даже когда функция OnComplete возвращает false, как говорит MSDN: Чтобы отменить обновление страницы, верните false из функции JavaScript.

Как предотвратить обновление страницы в зависимости от полученного ответа?

Спасибо!

----- ОБНОВИТЬ -------

Пока я нашел следующее решение. Когда я не указываю UpdateTargetId, я могу сделать ответ вручную, что хочу. Но это все еще недокументированное поведение с return false.


person Jozef Krchňavý    schedule 24.09.2012    source источник
comment
Возможно, это поможет, также посмотрите первый комментарий stackoverflow.com/a/1357151/985284   -  person Garrett Fogerlie    schedule 24.09.2012
comment
Это не так (но, конечно, я пробовал и эти два метода). Это обработка MS для Ajax.BeginForm с такими событиями, как OnBegin, OnComplete, ... И OnComplete в соответствии с документом MSDN должна иметь возможность останавливаться, возвращая false.   -  person Jozef Krchňavý    schedule 24.09.2012


Ответы (1)


Используйте OnSuccess и избавьтесь от UpdateTargetId. Нравится:

@using (Ajax.BeginForm("Action", "Controller", new AjaxOptions { HttpMethod = "Post", OnSuccess = "foo" }))
{
    ...
}

а потом:

function foo(result) {
    if (result.SomePropertyThatExistsInYourJsonObject) {
        // the server returned a JSON object => show the dialog window here
    } else {
        // the server returned a partial view => update the DOM:
        $('#DivFormId').html(result);
    }
}
person Darin Dimitrov    schedule 25.09.2012
comment
Чтобы использовать Ajax.BeginForm, вам понадобится следующий файл javascript (который не входит в стандартную комплектацию шаблона MVC 5): jquery.unobtrusive-ajax.js nuget.org/packages/Microsoft.jQuery.Unobtrusive.Ajax/3.2.3 - person Baxter; 24.07.2015