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