2010-05-10 111 views
10

是否有可能編譯一個Web應用程序項目.ascx(用戶控制)到一個DLL?編譯Web應用程序項目ascx到DLL

我要做到以下幾點:

  1. 使用相同的控制在多個網站
  2. 嵌入CSS和.js文件作爲資源到控制
  3. 能夠更新超級容易。如果用戶控制更新,我只想更新1 .dll

我已成功地關注此文章http://msdn.microsoft.com/en-us/library/aa479318.aspx

但是,這使用網站項目,我不能將js css作爲資源嵌入到網站項目中。

任何想法?我是否在談論這個錯誤,我應該改變方法嗎?

+0

你analized我粘貼的解決方案?它非常適合創建用戶控制庫。如果可能的話,我會避免創建用戶控件庫,但如果你沒有選擇看看文章 – 2010-05-10 21:35:51

回答

3

由於標記ascx文件,以這種方式使用用戶控件很困難。如果你想創建可重用的控制庫,你最好創建自定義控件。

+0

我想補充一點,如果用戶控件不是高度複合的,那麼這是最少的痛苦的路要走。事實上,我已經重構了代碼,以便我的ascx文件不是複合控件,所以它們可以更容易地製作成服務器控件,通常這些控件都是從ASP.NET控件中構建的。 – MatthewMartin 2010-05-10 20:47:12

+0

在這種情況下創建自定義控件並不是真正的選擇,我從第三方獲取代碼,然後我嘗試將其嵌入到3個不同的網站中。我無法控制代碼的獲取方式,我不想將其重寫到自定義控件中,特別是每次更新都必須重新編寫。 – cjburkha 2010-05-10 21:16:08

+0

與其試圖將用戶控制權撬進一個你可以參考的dll,你最好是在每個web應用程序中使用用戶控件的來源,並使用源代碼控制(如subversion的外部特徵)保持同步。 http://justaddwater.dk/2007/10/23/setting-up-subversion-externals-with-tortoisesvn/ – 2010-05-10 21:40:13

5

轉換很簡單,甚至可以完全自動化。它只需要在需要嵌入ASCX控件的DLL項目中更改一些設置和基類。

1 ...對於每個UserControl,將ASCX文件的Build Action(屬性下)設置爲「Embedded Resource 「,並刪除其關聯的設計器文件。

2 ...保存該項目。

3 ...右鍵單擊該項目並選擇「卸載項目」。

4 ...再次右鍵單擊並選擇「編輯* .csproj」選項。

看起來像這樣(其中星號代表你的類名)段改爲:

<Compile Include="*.ascx.cs"> 
    <DependentUpon>*.ascx</DependentUpon> 
    <SubType>ASPXCodeBehind</SubType> 
</Compile> 

看起來像這樣

<Compile Include="*.ascx.cs" /> 

這將導致代碼隱藏文件單獨編譯的ASCX文件。

5 ...保存更改,然後右鍵單擊該項目並選擇「重新加載項目」。

6 ...打開所有「* .ascx.cs」文件,並使它們從以下自定義UserControl類繼承,而不是System.Web.UI.UserControl類(您可能需要找到父類類來完成這一步)。

public class UserControl : System.Web.UI.UserControl 
{ 
    protected override void FrameworkInitialize() 
    { 
     base.FrameworkInitialize(); 
     string content = String.Empty; 
     Stream stream = Assembly.GetExecutingAssembly().GetManifestResourceStream(GetType().FullName + ".ascx"); 
     using (StreamReader reader = new StreamReader(stream)) 
      content = reader.ReadToEnd(); 
     Control userControl = Page.ParseControl(content); 
     this.Controls.Add(userControl); 
    } 
} 

這個基類將加載和分析嵌入式ASCX文件的照顧。

7 ...最後,你需要放置在子文件夾ASCX文件,使他們的資源名稱(通過文件夾路徑自動確定)匹配其關聯的類的完整類型名稱(加「的.ascx」)。假設您的根名稱空間與您的項目名稱相匹配,那麼名爲「ProjectName.Namespace1.Namespace2.ClassName」的類將需要子文件夾「Namespace1 \ Namespace2」中的ASCX文件,因此它會嵌入名稱「ProjectName.Namespace1.Namespace2」。 ClassName.ascx」。

就是這樣!一旦編譯DLL並將其包含在另一個項目中,就可以像使用其他類一樣使用「new」運算符實例化用戶控件的實例。與往常一樣,一旦將控件作爲子控件添加到頁面上的頁面或另一個控件上,您的控件就會「抓住」當前頁面事件。

+0

我試圖在創建真正複雜的控件時使用這種方法,但沒有奏效。顯然問題出在ParseControl方法中,它不能處理像Eval和Bind這樣的數據綁定表達式。有這個想法嗎? – 2012-10-18 17:37:31

+0

這真是太神奇了。我設法通過一些調整來實現它。第7步不是必需的,它不喜歡每個命名空間都有子目錄,但是在根目錄下工作。每個前端控件必須通過this.FindControl('litOutput')手動聲明/註冊;並且事件必須在後端進行註冊。除此之外,我迄今還沒有其他問題! – Radderz 2017-01-04 18:04:47

1

另一種方法是將用戶控件轉換爲自定義控件。關於MSDN: Turning an .ascx User Control into a Redistributable Custom Control有一篇很好的文章,它描述瞭如何做到這一點。以下是摘要:

  1. 編寫用戶控制像往常一樣,通常使用Visual Studio設計。
  2. 在嘗試部署它之前使用簡單的頁面對其進行測試。
  3. 部署應用程序以預編譯它。
  4. 抓取由部署步驟 生成的用戶控件的程序集,並且基本完成:您擁有自定義控件。
  5. 最後,在其他應用程序中使用您的自定義控件,方法與您總是使用自定義控件的方式相同。

希望這會有所幫助。

相關問題