2010-05-10 110 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. 最后,在其他应用程序中使用您的自定义控件,方法与您总是使用自定义控件的方式相同。

希望这会有所帮助。

相关问题