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