2010-08-04 5 views
2

Ou toute solution de contournement viable.Méthode d'appel sur la page maître à partir de WebMethod

Alors, imaginez une page principale qui implémente IFooMaster avec une méthode ShowFancyMessagePopupTheBusinessCantLiveWithout(string message);

Je suis dans une page qui hérite de cette page maître. Si une case n'est pas cochée, je veux montrer à l'utilisateur que s'il l'enregistre, il ne peut pas la cocher à nouveau sans une action d'administration.

J'ai reçu des commentaires que je ne peux pas simplement utiliser un alert('message'); en javascript parce qu'ils veulent l'aspect cohérent de ces messages.

Ensuite, j'ai essayé de faire un appel ajax via PageMethods (car c'est ce que tout le reste dans ce code utilise) pour afficher un message. Mon problème réside dans cette méthode étant statique.

[WebMethod] 
public static void ShowSuperImportantMessage() 
{ 
    if(!checkboxICareAbout.Checked) 
     ((IFooMaster)Master).ShowFancyMessagePopupTheBusinessCantLiveWithout("If you uncheck that thing, you can't recheck it."); 
} 

Depuis ShowSuperImportantMessage() est static, je ne peux pas accéder Master à l'intérieur.

La méthode sur la page principale ressemble plus ou moins comme ceci:

public void ShowFancyMessagePopupTheBusinessCantLiveWithout(string message) 
{ 
    lblGenericMessage.Text = message; 
    btnGenericMessageOK.Focus(); 
    upGenericMessage.Update(); 
    mpeGenericMessage.Show(); 
} 

mpeGenericMessage est un ajaxToolkit: ModalPopupExtender.

upGenericMessage est un panneau de mise à jour.

Les 2 autres sont évidents.

Des idées? Puis-je faire du kung-fu jQuery pour montrer ce genre de choses? J'ai essayé, mais la solution s'est plainte que les contrôles que j'ai essayé de faire référence par ClientID n'ont pas été résolus puisqu'ils étaient sur la page principale.

modifier rapidement: Avant que quelqu'un me dit l'architecture est un problème, ou je ne devrais pas avoir mis une telle chose sur une page maître ou w/e ...

Je sais que la situation est pas idéal, mais je suis ce code hérité, et je ne peux pas tout laisser tomber et réécrire la moitié de leur pile web.

+0

L'architecture est le problème. Vous ne devriez pas avoir mis une telle chose sur une page maître. =) –

+0

Merci M. Utile :) –

+0

Cela ressemble à un P.O.S que j'ai déjà eu à travailler avec ... Je ressens votre douleur :) –

Répondre

0

Désolé de prendre le temps de répondre/répondre. Je ne suis pas fier de cela du tout, mais la solution finale était de coder en dur les identifiants des clients dans le jQuery qui a attiré la boîte de dialogue modale sur la page principale.

Comme je l'ai dit, je ne suis pas fier de cette solution sale et sale. Cependant, la consolation est que, puisque c'est sur la page maître, il n'y a pas vraiment de conteneur de nommage au-dessus. En tant que tel, il est beaucoup moins susceptible de rencontrer des problèmes avec le clientID changer.

0

Avez-vous essayé quelque chose comme window.top avant le ClientID?

Par commentaires Vous n'avez pas besoin de coder en dur le code client. Depuis votre js est à la page, essayez quelque chose le long des lignes suivantes ....

window.top.document.getElementById("<%= yourelement.ClientID %>").Whatever(); 
+0

pas de dés. Peut-être que si je code directement le clientID dans le javascript, mais je ne veux vraiment pas le faire. –

+0

@Andy_Vulhop est le js dans la page ou un fichier séparé? –

+0

Heneks à la page. –

1

Essayez quelque chose comme ça (non testé):

((IFooMaster) ((Page)HttpContext.Current.Handler).Master) 

Il semble que cela ne fonctionne pas - Master n'est pas connecté lorsque la méthode PageMethod est appelée (logique). Donc, créez plutôt une page vide en utilisant la même page maître. Avoir cette page accepter un POST ou GET avec tous les paramètres que vous devez passer à votre méthode de page maître. Avoir le Page_Load extrait les paramètres et appelle la méthode. Il devrait ensuite utiliser Response.Write pour retourner un résultat (et n'oubliez pas de changer le type de contenu). Demandez à votre code côté client d'appeler la page et d'obtenir le résultat.

+1

Presque. ((Page) HttpContext.Current.Handler) m'avait excité, mais alors .Master est revenu null. –

+0

@Andy: C'est dommage. Je suppose que le pagemethod ne passe pas par le cycle de vie de page approprié pour obtenir le «Master» connecté. –

Questions connexes