2015-06-19 64 views
5

試圖將一個通用的自定義控件移動到一個新的類庫(也嘗試了一個新的Web項目),以便其他項目可以使用它,但它的屬性是在另一個項目中使用時始終爲NULL。不幸的是,搜索類似的問題並不能解決我的問題。從另一個項目/ DLL引用的Asp.NET用戶控件具有NULL屬性

我註冊在我們web.base.config新的控制項目-A

<add tagPrefix="Controls" namespace="Comp.UserWebControls.Controls" assembly="Comp.UserWebControls" /> 

添加爲項目-A項目引用的Comp.UserWebControls(我也嘗試添加構建DLL作爲在Project-A的基準,沒有區別)

的標記看起來像

<asp:Content ID="Content4" ContentPlaceHolderID="RightPlaceHolder" runat="server"> 
<Controls:uxMyControl ID="TestingThing" runat="server" /> 

在後面的代碼中,「TestingThing」控件被實例化,但所有屬性均爲null(標籤,文本框等)

通常,如果控件位於同一項目(Project-A)內,這樣的控制:

<add tagPrefix="Contols" tagName="uxMyControl" src="~/Controls/uxMyControl.ascx"/> 

而在代碼隱藏控制對象看起來不錯,性能實例化並如預期工作。

我不能做src="myPath"當使用程序集,所以我認爲這與它有關。

我該如何將此控件分離出來以便其他項目可以使用它。

任何幫助,將不勝感激謝謝!

+0

您是否將'.ascx'文件本身包含到您想要使用自定義控件的其他項目中? –

+0

This SO threads may help you - http://stackoverflow.com/questions/709617/using-user-controls-from-other-projects-in-asp http://stackoverflow.com/questions/10340610/asp -net-user-control-instance-null-when-referenced-on-page-load-on-page-code –

+0

@ChandanRoy - 是的,我把用戶控件的整體移到了新項目中。 我很想看看這個鏈接,謝謝 – Jerrold

回答

2

我不認爲你可以將User Control(例如.ascx文件)放到類庫中,以便在不同的應用程序之間共享。

取而代之,您需要編寫Custom Control。這基本上是一個從Control(或Control的變體 - 例如,如果要製作自己的自定義下拉列表控件,則可以從DropDownList派生)的類(單個.cs文件,無相關的ascx)。

差異:https://msdn.microsoft.com/en-us/library/aa651710(v=vs.71).aspx

這裏有另一個MSDN文章:https://msdn.microsoft.com/en-us/library/aa479318.aspx其中討論瞭如何將來自用戶控件創建一個自定義的控制,如果你是不是感覺很舒服與它的想法。

它概括如下步驟:

  1. 就像平時,通常使用 Visual Studio設計編寫用戶控制。
  2. 在嘗試使用 進行部署之前,使用簡單頁面對其進行測試。
  3. 部署應用程序以預編譯它。
  4. 抓住用戶 通過部署步驟生成的控件組件,而你基本上完成了 :您有自定義控件。
  5. 最後,在其他應用程序中使用您的 自定義控件,方法與您始終使用自定義控件 相同。

如果你想有控件的集合,不希望對每個單獨的DLL,那麼你可以使用反編譯器,如反射來看看一直產生什麼,只是複製/粘貼到您的共享控件的類庫。

然後,您應該能夠註冊的TagPrefix和命名空間,你已經表明: <add tagPrefix="Controls" namespace="Comp.UserWebControls.Controls" assembly="Comp.UserWebControls" />

,你應該準備好了。

如果用戶控件不是特別複雜,那麼我可能會試圖閱讀關於純代碼Custom Controls的信息,並試着像這樣寫,而不是試圖獲取和反編譯DLL。

我認爲你得到空值的原因很可能與視圖狀態和頁面生命週期有關。這總是我在Webforms中遇到的大多數問題,特別是動態加載的控件,找出你應該加載它們的生命週期中的哪個部分。我似乎記得,例如,如果您在Page_Load中動態添加它們,它們似乎總能正常工作,但從未在回發中持續保留值,但後來Page_Init正常工作。

所以我會說 - 創建一個自定義控件,一個用戶控件的類文件,擺脫.ascx的任何痕跡,你應該很好去。

+0

非常感謝 - 我已經擱置了這個想法,因爲我不想旋轉我的輪子太久,並回到複製/粘貼頁面到2個項目。希望生病有時間重新審視和重構未來..感謝您的簡潔的答案。我希望有同樣問題的其他人可以驗證。將這個標記爲最正確的。 – Jerrold

相關問題