2012-09-24 11 views
10

Ho un semplice modulo Ajax in MVC. In AjaxOptions c'è OnComplete impostato su una semplice funzione javascript che fa una cosa - restituisce false.Ajax.BeginForm con OnComplete aggiorna sempre la pagina

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

function preventUpdate(xhr) { 
    return false;  
} 

Il problema è che quella pagina è già stata aggiornata. Per esempio. in un caso il controller restituisce una vista parziale dopo il postback, in altri casi restituisce un oggetto Json. Voglio che aggiorni la pagina quando viene restituita la vista parziale e mostra la finestra di dialogo quando viene restituito json. Sfortunatamente quando viene restituito json, cancella la pagina (aggiornala con json) anche quando la funzione OnComplete restituisce false come dice MSDN: Per annullare l'aggiornamento della pagina, restituisce false dalla funzione JavaScript.

Come evitare l'aggiornamento della pagina in base alla risposta ricevuta?

Grazie!

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

Finora ho trovato la soluzione seguente. Quando non si specifica UpdateTargetId, posso eseguire manualmente la risposta ciò che voglio. Ma non è ancora un comportamento documentato con return false.

+0

Forse questo aiuterà, anche guardare il primo commento http://stackoverflow.com/a/1357151/985284 –

+1

Questo non è il caso (ma per essere sicuro, ho provato anche questi due metodi). Questa è la gestione della MS per Ajax.BeginForm con eventi come OnBegin, OnComplete, ... E OnComplete secondo MSDN doc dovrebbe essere possibile arrestare restituendo false. –

risposta

22

Utilizzare OnSuccess e liberare UpdateTargetId. Come questo:

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

e poi:

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);' ha funzionato per me – Filip

+0

Per utilizzare Ajax.BeginForm è necessario il seguente file javascript (che non è standard nel modello MVC 5): jquery. unobtrusive-ajax.js https://www.nuget.org/packages/Microsoft.jQuery.Unobtrusive.Ajax/3.2.3 – Baxter

Problemi correlati