2012-09-24 3 views
10

У меня есть простая форма ajax в MVC. В AjaxOptions есть OnComplete, установленный на простое javascript-функцию, которое делает одно - возвращает false.Ajax.BeginForm с OnComplete всегда обновляет страницу

@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.

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

Спасибо!

----- UPDATE -------

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

+0

Возможно, это поможет, также посмотреть на первый комментарий http://stackoverflow.com/a/1357151/985284 –

+1

Это не так (но, конечно, я пробовал и эти два метода). Это обработка MS для Ajax.BeginForm с событиями, такими как OnBegin, OnComplete, ... И OnComplete в соответствии с документом MSDN следует прекратить, возвращая false. –

ответ

22

Используйте 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); 
    } 
} 
+0

'$ ('# DivFormId'). Html (result.responseText);' работал для меня – Filip

+0

Для использования Ajax.BeginForm вам нужен следующий файл javascript (который не входит в стандартный шаблон MVC 5): jquery. unobtrusive-ajax.js https://www.nuget.org/packages/Microsoft.jQuery.Unobtrusive.Ajax/3.2.3 – Baxter