2010-08-18 5 views
0

TL; DR: Tous les contrôles d'un contrôle utilisateur utilisé en dehors de son projet home sont null lorsque les méthodes Page_Init/Page_Load d'usercontrol sont appelées.Contrôle null lors de l'utilisation d'un contrôle utilisateur entre projets

La configuration est comme ceci:

Projets "UI.Frontend", "UI.ControlPanel" et "UI.Common" sont "ASP.NET Web Application" s. UI.Common n'est jamais destiné à être accédé directement - il contient juste UserControls qui sont nécessaires à la fois dans le frontend et le panneau de contrôle.

Ainsi, un fichier ASPX (SomeFrontendPage.aspx) en UI.Frontend contient les lignes:

<%@ Register tagprefix="BP" Namespace="UI.Common" Assembly="UI.Common" %> 

et plus tard:

<BP:MyControl runat="server" ID="ctlMyControl" /> 

alors que plus en UI.Common, il y a un contrôle nommé MyControl (fichiers ascx, ascx.cs et ascx.designer.cs normaux). Maintenant, lorsque j'ouvre SomeFrontendPage.aspx dans un navigateur, ctlMyControl est chargé et ses méthodes init + load sont exécutées. Le problème est que tous les sous-contrôles de MyControl ne sont jamais initialisés. Exemple (si MyControl.ascx a un champ de texte d'ID txtBlah):

protected void Page_Init(object sender, EventArgs e) 
    { 
     txtBlah.Text = "test"; 
    } 

Le code ci-dessus fonctionnera, mais provoquera un pointeur nul (bien, « objet de référence non définie à une instance d'un objet ») depuis txtBlah sera nul.

Edit: Un contrôle exemple serait:

<%@ Control Language="C#" AutoEventWireup="true" CodeBehind="MyControl.ascx.cs" Inherits="Common.MyControl" %> 
Whatever: <asp:TextBox ID="txtWhatever" runat="server" /> 

Répondre

0

Vous pouvez trouver que vous avez plus de problèmes que ce qui est immédiatement affiché. Les fichiers ASCX ne sont pas intégrés dans les assemblages par défaut, et lorsqu'ils le sont, vous devez ensuite créer un fournisseur de chemin virtuel pour y accéder. Pouvons-nous voir un exemple de contrôle?

+0

Cela peut-être - J'ai utilisé la méthode d'assemblage de registre à l'origine parce que je ne pouvais pas trouver un moyen de partager les contrôles entre les projets sans jouer avec les répertoires virtuels. Après avoir posté cette question, j'ai créé une nouvelle solution avec deux projets vides et la configuration décrite ci-dessus pour essayer d'isoler ce problème de tous les autres facteurs qui pourraient être présents dans mon travail actuel. Il s'avère que la chose inter-projets n'a pas d'importance - "@Register Assembly" ne fonctionne pas pour autoriser les contrôles usuels entre projets. :( – Fishtoaster

Questions connexes