在不同的网站应用程序之间共享ASP.NET .ascx控件的最佳方法是什么?

15
假设您在IIS中有两个不同的ASP.NET应用程序,并且您有一些ASCX控件希望跨这两个应用程序共享使用。创建一个“用户控件库”来实现相同控件实现在这两个应用程序中使用是最佳方式,以避免重复编写代码。
控件具有包含HTML和后台代码的ASCX文件。
组合控件将会比较困难,因为我们与使用ASCX文件中的HTML语法来设计控件的设计师合作。
Tundey,我们在这里使用SVN。你有没有关于如何实施你的建议的示例? SVN如何共享ASP.NET控件?
谢谢!
10个回答

15

我查看了几个解决方案,如果您有现有的用户控件要在网站之间共享,那么这绝对是最简单的。 - Tom Brown

6

如果您想在不同的项目中使用控件,就需要创建组合控件而不是.ASCX控件。


2
除了Tundey所说的之外, NTFS链接 shell扩展在共享大量内容(例如:具有.ascx / .aspx的文件夹)的独立项目之间非常有帮助。对于代码而言,我认为从版本控制系统中创建另一个工作副本更可取。

2

很棒的文章,有效!如果您能总结一下文章的内容,那么您的答案会更好。 - Martin Braun

1

另一种选择是使用您的源代码控制工具在您的 Web 应用程序之间“共享” ASCX 控件。这将允许您在任何一个应用程序中更改控件,并确保源代码控制工具反映这些更改。


1
我注意到在ASP.Net中控件最大的问题是,你不能轻松地获得设计师支持,既可以构建控件,又可以在构建后在站点中使用控件。我唯一能做到的方法是创建一个没有代码后台的.ascx控件(即:所有服务器端代码都在.ascx文件的脚本标记中,并带有runat="server"属性)。
但即使如此,你仍然需要复制.ascx文件,所以如果你需要进行更改,这意味着需要在使用它的每个位置更新文件。所以,确保它在源代码控制中。

1

我通过牺牲一些最初构建控件的便利性来实现这一点。

您可以创建一个控件库项目,它将为您生成一个控件库 DLL。缺点是您必须仅使用代码创建控件。在我的上一个项目中,这很好。但在更复杂的控件中,可能会出现问题。

以下是一个示例:

<DefaultProperty("Text"), ToolboxData("<{0}:BreadCrumb runat=server />")> _
Public Class BreadCrumb
    WebControl

    <Bindable(True)> _
    Property Text() As String
        '...'
    End Property

    Protected Overrides Sub RenderContents(output as HtmlTextWriter)
        output.write(Text)
    End Sub

    Private Sub Page_Load(...) Handles MyBase.Load
        ' Setup your breadcrumb and store the HTML output '
        ' in the Text property '
    End Sub
End Class

无论您将什么放入该文本属性中,都将被呈现。

然后,您放置在此处的任何控件都可以像您使用的任何其他控件一样运行。只需将其导入到工具箱中,进行注册引用,然后将其放置在 ASP 页面上即可。


0
我有一个建议。我们可以通过在网站项目中创建用户控件,然后更改网站属性以使用固定命名和单个页面程序集的方式,在多个应用程序中使用用户控件DLL。

0

我在这里使用StarTeam,它允许您在多个文件夹之间“共享”对象(文件、更改请求、需求等)。不确定Subversion(SVN)是否具有该功能。如果没有,这里有另一个技巧可以使用:从控件的主要位置创建到其他项目中位置的连接点。连接点就像Unix符号链接一样。您可以从此处下载用于在Windows中创建连接点的工具。


0

我最近做了一个Web应用程序,只是从一个Web应用程序(aspx、master和ascx)引用文件(总共约90个),没有太多问题。话虽如此,我使用了一个经过大量修改的MVP模式版本,许多接口和约定来降低复杂性,相同的中间层和一个站点是另一个站点的子集。

主要问题:

  1. 母版页(以及设计师和HTML视图格式)在引用文件上不起作用,因此您会失去很多功能。我的解决方法是预构建步骤和大量的svn:ignore条目。将预构建任务执行在正确的文件夹中也是CruiseControl.NET的一大难题。
  2. 共享页面/控件需要极其注意它们所涉及和引用的内容,以避免引入额外的依赖项。
  3. 两个站点在部署时被锁定在一起。
  4. 现在我必须祈祷维护者阅读我写的关于我制造的混乱的小文档。这远远超出了我在ASP.NET项目中看到的范围。
我在极大的时间压力下努力让它工作,现在两个应用程序都已经投入生产。虽然我不建议这样做,但如果你有兴趣,请从以下开始:

添加现有项,选择一些文件,点击添加按钮的箭头并选择添加为链接


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接