2010-11-09 27 views
0

J'essaie de comprendre comment effectuer ce qui suit:ASP.NET AJAX - ScriptManagerProxy et manipulation bouton html clique

  • poignée clic côté client cas de bouton - éviter postback si le résultat de javascript appel est faux (par exemple onclick="js:return IsThisAllowed()")
  • méthode Javascript retourne vrai ou faux, selon le résultat de l'appel à la méthode de service Web généré en utilisant ScriptManagerProxy

Le code ci-dessous est simplifiée vers le bas pour les principaux composants que je parle i n cette question. Je peux alerter() la valeur de retour sans probleme, mais la partie que je rencontre des problemes est comment je peux retourner le resultat de l'appel de la methode de service web au gestionnaire onclick? Puisque la fonction Finish() est appelée dans un thread séparé en cas de réussite de ce que je suppose être l'appel XmlHttp.send(), comment puis-je envoyer la valeur de la réponse en tant que valeur de retour de la méthode javascript? Est-ce que je vais à ce sujet tout faux? J'ai déjà utilisé un code similaire plusieurs fois avant de mettre à jour le DOM avec les valeurs de retour, comme dans <div>, mais je n'ai jamais eu à m'inquiéter de capturer la valeur de retour et de l'utiliser dans mon script.

Ce que j'ai jusqu'à présent:

méthode de service Web .NET (VB.NET):

<WebMethod()> _ 
<ScriptMethod()> _ 
Public Function IsAllowed() As Boolean 
    Return True 
End Function 

code .NET pour la page pour générer des méthodes de service Web AJAX, et le bouton html

<asp:ScriptManagerProxy ID="ScriptManagerProxy1" runat="server"> 
    <Services> 
     <asp:ServiceReference Path="~/WebServices/MyWebService.asmx" /> 
    </Services> 
</asp:ScriptManagerProxy> 
<asp:Button ID="_btn" runat="server" OnClientClick="js:return IsAllowed();" /> 

Javascript

Répondre

2

Vous ne pouvez pas faire cela: l'appel au service Web est une requête asynchrone au serveur qui renvoie immédiatement le contrôle au client - et votre javascript finira (presque) toujours avant la fin de la requête (probablement avant la demande est même délivrée).

Puisque vous ne savez pas quand vous recevrez la réponse de l'appel à ws.IsAllowed, vous devez le gérer dans vos rappels (Finish et Error).

(Ceci est vrai quel que soit le mécanisme AJAX que vous utilisez.)

Je ne suis pas assez familier avec AJAX base ScriptManager pour vous dire exactement comment faire, mais l'idée générale est que je Pour le faire: au lieu d'annuler l'événement click d'un bouton ASP.NET, je ne déclencherais le bouton ASP.NET que si l'appel AJAX renvoyait true. En utilisant jQuery, je le ferais en faisant l'appel AJAX à partir d'un bouton HTML vanilla (pas un contrôle Web ASP.NET). Dans le gestionnaire de succès (l'équivalent de Finish), je déclencherais mon bouton ASP.NET (que je cacherais probablement) lorsque la valeur de retour est vraie.

+0

Oui, c'est ce que j'ai vécu, mais avez-vous des suggestions pour accomplir ce que j'essaie de faire? – Keith

+1

Je pense que j'ai compris ce que vous essayez d'accomplir - l'annulation de l'ASP.Postback NET basé sur le résultat de l'appel de service Web. Je mets à jour ma réponse avec une solution. –

+0

Exactement - et j'ai déjà la logique dans l'événement click pour empêcher le traitement (et lancer une erreur) si l'appel n'est pas autorisé, mais je préfère ne pas avoir la surcharge d'une publication complète si je peux accomplir cette Ajax- style. – Keith

0

Avez-vous envisagé d'utiliser jQuery?

$.ajax({ 
    type: "POST", 
    contentType: "application/json; charset=utf-8", 
    dataType: "json", 
    url: "~/WebServices/IsAllowed.asmx/{Method Name}", 
    data: ('{ whatever data is needed for decision making json serialized }'), 
    success: function (msg) { 
     alert(msg); 
      }, 
    error: function (request, status, error) { 
        alert(err.Message); 
        alert(err.StackTrace); 
    } 
}); 
+0

Les deux accompliront exactement le même résultat - en cas de succès, je n'aurai toujours aucun moyen de renvoyer le résultat de l'appel au gestionnaire onclick. – Keith