2010-08-18 59 views
0

TL; DR:当用户控件的Page_Init/Page_Load方法被调用时,在其家庭项目外使用的usercontrol中的所有控件都为null。当在项目之间使用UserControl时控制为空

的设置是这样的:

项目 “UI.Frontend”, “UI.ControlPanel” 和 “UI.Common” 是 “ASP.NET Web应用程序” S。 UI.Common永远不会被直接访问 - 它只包含前端和控制面板中都需要的UserControl。

所以,在UI.Frontend一个aspx文件(SomeFrontendPage.aspx)包含线路:

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

及更高版本:

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

,同时在在UI.Common,有一个名叫控制MyControl(正常的ascx,ascx.cs和ascx.designer.cs文件)。现在,当我在浏览器中打开SomeFrontendPage.aspx时,ctlMyControl被加载,它的init + load方法被执行。问题是MyControl的所有子控件都不会被初始化。实施例(如果MyControl.ascx具有ID txtBlah的文本字段):

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

上面的代码将运行,但会导致空指针(当然,“对象引用不设置为一个对象的一个​​实例”),因为txtBlah将为空。

编辑: 一个例子控制将是:

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

回答

0

你会发现你有更多的问题,什么是立即显示。默认情况下,ASCX文件没有嵌入到程序集中,如果它们存在,则需要创建一个虚拟路径提供程序来访问它们。

我们可以看到一个示例控件吗?

+0

这可能是我最初使用的注册汇编方法,因为我找不到任何方式来共享项目之间的控件,而不会与虚拟目录搞混。 发布此问题后,我创建了一个新的解决方案,其中包含两个空项目和上述设置,以尝试将此问题与可能出现在我当前工作中的任何其他因素隔离。事实证明,跨项目的东西并不重要 - “@Register Assembly”不支持跨项目usercontrols。 :( – Fishtoaster 2010-08-18 16:17:11

相关问题