2010-06-07 13 views
2

J'ai un projet de site Web, et à l'intérieur de celui-ci, j'ai un utilisateur Web Control défini dans un fichier ASCX.Contrôle Web ajouté au type de contrôle .master introuvable dans la page enfant

Le contrôle est ajouté à Site.Master et il s'affiche correctement sur la page et tout va bien.

Je dois remplacer certains des champs du contrôle sur l'une des pages qui dérivent de Site.Master.

// In OnLoad: 
MyControlName control = (MyControlName) Page.Master.GetBaseMasterPage().FindControl("controlID")); 

Le problème est que MyControlName ne s'inscrit pas en tant que type valide sur la page enfant. Si j'ajoute directement une deuxième instance du contrôle à la page enfant, la procédure ci-dessus fonctionne, mais si le contrôle n'est pas placé directement sur la page et qu'il n'est défini que dans la page maître, le type n'est pas défini. Le contrôle n'est pas dans un espace de noms, et est défini dans le projet, donc je ne sais pas pourquoi il a un tel emplacement de problème le type approprié.

Si je mets un point d'arrêt dans le OnLoad, le type indiqué pour le contrôle est ASP.my_control_name_ascx, mais cela ne fonctionne pas non plus.

Pourquoi la classe enfant ne peut-elle pas référencer le type correct? Puis-je résoudre ce problème?

Merci!

Répondre

0

Je suppose GetBaseMasterPage() est votre propre méthode? Que se passe-t-il si vous essayez:

MyControlName control = (MyControlName)Page.Master.FindControl("controlId"); 

?

+0

Oui, il est notre propre fonction. Nous avons un maître de site et des maîtres de section. Tous les maıtres de section n'héritent pas forcément du maître du site, de sorte que la fonction ne fait que passer à la page maître la plus haute. Ce code fonctionne correctement si une deuxième instance du contrôle est placée sur la page. c'est-à-dire qu'il localise le contrôle sur le maître et met à jour l'état du contrôle de la page maître, mais seulement si la page enfant a une instance du contrôle sur celle-ci. Sinon, le compilateur dit qu'il s'agit d'un type inconnu. Donc, c'est juste un problème de résolution de type, pas un problème de fonctionnalité. – turtle

+0

Point rapide (pédant) sur cet échantillon de code; vous auriez besoin de mettre Page.Master entre parenthèses pour obtenir le type: MyControlName control = ((MyControlName) Page.Master) .FindControl ("controlId"); –

+0

Je ne vois pas pourquoi, Page.Master est une propriété de type MasterPage, qui hérite de Control, qui a la méthode FindControl. Vous avez seulement besoin de convertir le résultat, qui est le résultat de la méthode FindControl, vous n'avez pas besoin d'accrocher plus loin. –

1

Le contrôle n'a pas de portée globale sur l'ensemble du projet. Il ne peut être sélectionné que comme type sur les pages où le contrôle est enregistré. Donc, vous devez enregistrer le contrôle sur la page des enfants:

<%@ Register src="WebUserControl.ascx" tagname="WebUserControl" tagprefix="uc1" %> 

Vous devez ajouter une balise de registre comme ci-dessus en haut de votre enfant page ASPX.

L'autre option est que vous pouvez créer une interface pour le contrôle qui expose les propriétés ou méthodes auxquelles vous voulez accéder, et placer l'interface dans app_code ou dans un autre endroit accessible globalement, puis mettre en oeuvre l'interface. le contrôle à l'interface.

0

Pas une réponse directe à votre question, mais vous pourriez trouver le @MasterType directive utile.

Si vous ajoutez une ligne comme

<%@ MasterType TypeName="ClientName.SiteName.MasterPages.SiteMaster" %> 

en haut de votre page ASPX, vous devriez être en mesure de se référer à la page principale dans le code sans avoir à le lancer. Cela pourrait peut-être aider le code à trouver votre contrôle, peut-être?

Vous pourriez vous retrouver avec une ligne comme:

// In Page.OnLoad: 
MyControlName control = Page.Master.MyControl; 

puis exposer une nouvelle propriété dans la page principale qui enveloppe le FindControl appel:

// In Site.master.cs 
internal MyControlName MyControl 
{ 
    get { this.FindControl("controlID"); } 
} 

Hope this helps!

1

Le code suivant fonctionne pour moi:

DropDownList ddlLanguage = (DropDownList)Page.Master.FindControl("ddlLanguage");