2017-10-18 6 views
0

Je travaille avec une application web de l'héritage - il y a une forme avec des entrées de texte et des entrées de fichiers, et le formulaire est enregistré sur un postback ..ASP.NET PostBack après la réponse AJAX

HTML:

<input id="txt1" name="txt1" type="text" /> 
<input id="hfd1" name="hfd1" type="hidden" value="-1" /> 
<input id="file1" name="file1" runat="server" type="file" /> 
<asp:Button ID="btnSave" runat="server" OnClientClick="return PrepareSave()" OnClick="btnSave_Click" Text="Save" /> 

JS:

function PrepareSave() { 
    $('#hfd1').val($('#txt1').val()); 
    return true; 
} 

je dois envoyer une requête AJAX à l'intérieur PrepareSave() pour valider un champ sur le serveur, et en fonction de la réponse, poursuivre le ou PostBack ne le font pas. J'ai essayé ceci:

function PrepareSave() { 
    Project1.Web.Services.AJAXService1.CheckSomething(someString, function (result) { 
     if (result == true) { 
      // continue PostBack 
      $('#hfd1').val($('#txt1').val()); 
      return true; 
     } 
     else { 
      // abort PostBack 
      alert('invalid'); 
      return false; 
     } 
    }); 
} 

Mais il échoue - il ne publie pas indépendamment de la réponse AJAX. J'ai essayé d'implémenter la réponse acceptée here mais elle a les mêmes problèmes. Que puis-je faire pour le faire fonctionner?

J'ai essayé de simplifier cette réponse acceptée ci-dessus, pour le tester:

<asp:Button ID="btnSave" runat="server" ClientIDMode="Static" OnClientClick="PrepareSave(); return false;" Text="Save" /> 
<asp:Button ID="btnSaveHidden" runat="server" ClientIDMode="Static" OnClick="btnSave_Click" Visible="False" /> 

function PrepareSave() { 
    $('#btnSaveHidden').click(); // does nothing. also tried .trigger('click') 
} 
+0

problème est que ajax est asynchrone. Votre formulaire ne sait pas attendre le résultat. Et 'return' dans votre callback ajax ne renvoie pas une valeur de PrepareSave(). Si vous ne renvoyez pas explicitement une valeur d'une fonction JS, tout code appelant qui essaie de lire la valeur de retour obtient par défaut une valeur false-y. D'où la raison pour laquelle la publication est arrêtée. Fondamentalement, vous devez annuler la publication, effectuer votre appel ajax, puis, si cela vous convient, déclencher à nouveau la soumission par programmation. ou vous pourriez faire toute votre validation à l'intérieur de la publication pour simplifier les choses, si c'est pratique. – ADyson

+0

Je suis d'accord, pour vos besoins (comme je l'ai compris ici) une validation de serveur devrait faire l'affaire. Si vous voulez faire sth async et vous comptez sur les formulaires Web, je suggère d'utiliser un Updatepanel – DotNetDev

+0

Merci pour vos deux entrées ici. @DotNetDev, ouais sauf que cette forme est un écran modal, donc faire la validation sans ajax sera un peu douloureux. – user982119

Répondre

0

Dans le code derrière vous pouvez faire:

ClientScript.RegisterStartupScript(GetType(), "ReloadParent", "window.parent.location.href = window.parent.location.href;", true); 

ou js, utilisez la partie du script par lui-même:

window.parent.location.href = window.parent.location.href; 

hth.