2012-09-24 15 views
10

Tengo una forma ajax simple en MVC. En AjaxOptions hay OnComplete configurado para una función javascript simple que hace una cosa: devuelve falso.Ajax.BeginForm con OnComplete siempre actualiza la página

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

function preventUpdate(xhr) { 
    return false;  
} 

El problema es que esa página ya está actualizada. P.ej. en un caso, el controlador devuelve una vista parcial después de la devolución, en otro caso devuelve algún objeto Json. Quiero que actualice la página cuando se devuelve una vista parcial, y para mostrar la ventana de diálogo cuando se devuelve json. Lamentablemente, cuando se devuelve json, se borra la página (se actualiza con json) incluso cuando la función OnComplete devuelve falso, como dice MSDN: Para cancelar la actualización de la página, devuelve falso de la función de JavaScript.

Cómo evitar la actualización de la página según la respuesta recibida?

¡Gracias!

ACTUALIZACIÓN ----- -------

Hasta ahora he encontrado la solución siguiente. Cuando no especifico UpdateTargetId, puedo hacer manualmente con la respuesta lo que quiero. Pero todavía no está documentado el comportamiento con return false.

+0

Tal vez esto le ayudará, también mira el primer comentario http://stackoverflow.com/a/1357151/985284 –

+1

Este no es el caso (pero para estar seguro, intenté también con estos dos métodos). Este es el manejo de MS para Ajax.BeginForm con eventos como OnBegin, OnComplete, ... Y OnComplete de acuerdo con el documento de MSDN debería poder detenerse al devolver falso. –

Respuesta

22

Usa OnSuccess y deshazte de UpdateTargetId. De esta manera:

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

y luego:

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);' trabajado para mí – Filip

+0

Para utilizar Ajax.BeginForm necesita el siguiente archivo javascript (que no viene de serie en la plantilla MVC 5): jquery. discreto-ajax.js https://www.nuget.org/packages/Microsoft.jQuery.Unobtrusive.Ajax/3.2.3 – Baxter

Cuestiones relacionadas