2008-09-02 18 views

Répondre

6

Une façon vous pouvez faire est de câbler un gestionnaire Application.Load dans Application.Init, alors que gestionnaire lui-même après l'exécution de délier:

Sys.Application.add_init(AppInit); 

function AppInit() { 
    Sys.Application.add_load(RunOnce); 
} 

function RunOnce() { 
    // This will only happen once per GET request to the page. 

    Sys.Application.remove_load(RunOnce); 
} 

qui exécutera après Application.Init. Cela devrait être la dernière chose avant que pageLoad soit appelé.

2

Vous pourriez avoir une entrée cachée que vous définissez à une valeur connue du côté du serveur si elle est un postback/rappel - et votre javascript pourrait vérifier cette valeur.

Cela étant dit, j'espère vraiment qu'il existe une solution réservée au client pour cela.

Éditer: @mmattax - Je crois qu'il cherche une solution côté client - l'équivalent JavaScript de cela.

2

Ce que vous pouvez faire est de câbler jusqu'à l'événement de charge de la classe Sys.Application. Vous pouvez ensuite utiliser la propriété isPartialLoad de la classe Sys.ApplicationLoadEventArgs. Je crois que cela vous permettrait de savoir si vous êtes dans un postback asynchrone ou non.

Pour savoir si vous êtes dans un post de retour, vous devrez gérer cela dans le code côté serveur et l'émettre au client.

0

Vous pouvez toujours utiliser Page.IsPostback lors d'un appel asynchrone.

3

@Darren: Merci pour la réponse. J'avais essayé de créer pageLoad avec l'argument d'événement ApplicationLoadEventArgs comme paramètre (voir ci-dessous). Toutefois, selon this:

L'événement de chargement est déclenché pour toutes les publications sur le serveur, ce qui inclut les publications asynchrones.

Comme vous l'avez indiqué, la propriété isPartialLoad ne couvre pas tous les scénarios de publication. Ce sera bien si l'argument event contient aussi la propriété isPostback.

function pageLoad(sender, arg) { 
     if (!arg.get_isPartialLoad()) { 
      //code to be executed only on the first load 
     } 
    } 

@mmattax: Je recherche une propriété qui peut être appelée du côté client (javascript).

0

Application.Init est probablement un événement plus approprié à utiliser, si vous voulez seulement que le code s'exécute sur le premier chargement.

0

@Dave Ward: Cela fonctionnerait normalement. Toutefois, le code doit attacher l'événement sur l'objet de comportement. Parce que la création d'un objet de comportement se produit pendant Application.Init, la connexion à cet événement entraînera un comportement imprévisible.

Ce sera bien s'il y a un événement PostInit.

0

@Dave Ward: L'utilisation de la méthode RunOnce fonctionne parfaitement.Cela résout mon problème sans avoir la solution de contournement pour vérifier d'abord si le gestionnaire existe déjà avant d'attacher à un événement.

Je marquerai votre réponse comme une réponse acceptée. Merci encore.

0

Voici notre équivalent Ajax à isPostback que nous utilisons depuis un moment.

public static bool isAjaxRequest(System.Web.HttpRequest request) 
    {//Checks to see if the request is an Ajax request 
     if (request.ServerVariables["HTTP_X_MICROSOFTAJAX"] != null || 
      request.Form["__CALLBACKID"] != null) 
      return true; 
     else 
      return false; 
    }