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

时间:2008-08-26 13:38:04

标签: asp.net

假设您在IIS中有2个不同的ASP.NET应用程序。此外,您还要在这两个应用程序中共享一些ASCX控件。

创建“用户控件库”的最佳方法是什么,这样您就可以在2个应用程序中使用相同的控件实现,而不必重复代码?

控件的ASCX背后有HTML +代码。


复合控件很难,因为我们与使用ASCX文件中的HTML语法的设计师合作来设置控件的样式。

Tundey,我们在这里使用SVN。你有一个如何实施你的建议的例子吗? SVN如何共享ASP.NET控件?

谢谢!

10 个答案:

答案 0 :(得分:15)

Scott Guthrie在此提供了一些关于如何设置用户控件库项目的好建议,然后使用预构建事件将用户控件复制到多个项目中。它的效果非常好。

http://webproject.scottgu.com/CSharp/usercontrols/usercontrols.aspx

答案 1 :(得分:5)

如果您希望能够在单独的项目中使用它们,则需要创建复合控件而不是.ASCX控件。

答案 2 :(得分:2)

除了Tundey所说的, NTFS Link shell扩展在其他独立项目之间共享大量内容(例如:.ascx / .aspx的文件夹)时非常有用。在代码的情况下,我认为从VCS制作另一个工作副本是可取的。

答案 3 :(得分:2)

答案 4 :(得分:1)

另一种方法是使用源代码管理工具在您的Web应用程序之间“共享”ASCX控件。这将允许您对任一应用程序中的控件进行更改,并让源代码控制确保更改反映在我们的Web应用程序中。

答案 5 :(得分: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

您将在Text属性中放置任何内容。

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

答案 6 :(得分:0)

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

下载用于在Windows中创建联结的工具

答案 7 :(得分:0)

我注意到ASP.Net中的控件最大的问题是,一旦构建了控件,就无法轻松获得设计器支持在站点中使用控件构建控件。我能够做到的唯一方法是创建一个没有代码隐藏的.ascx控件(即:所有服务器端代码都在.ascx文件中的脚本标记中,并带有runat =“server”属性) 。

但即便如此,您仍然需要复制.ascx文件,因此如果您需要进行更改,则意味着在您使用它的每个位置更新文件。所以是的,确保它在源代码控制中。

答案 8 :(得分:0)

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

重大问题:

  1. 母版页(反过来设计师和html视图格式化)不能在引用的文件上工作,因此会丢失很多功能。一个预构建步骤和许多svn:忽略条目是我的黑客围绕这个。让CruiseControl.NET在正确的文件夹中执行预构建任务也是一件痛苦的事。
  2. 共享页面/控件需要非常了解它们的触摸和引用,以避免引入额外的依赖项。
  3. 两个站点都锁定在一起进行部署。
  4. 我现在必须祈祷维护人员阅读我关于我所造成的混乱的小文件。它远远超出了我在ASP.NET项目中看到的内容。
  5. 我受到了巨大的时间压力,要让它发挥作用,它确实,现在这两个应用程序都在生产中。我不推荐它,但如果你有兴趣,请从:

    开始
      

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

答案 9 :(得分:0)

我有一个建议.WE可以通过在网站项目中正常创建用户控件来跨多个应用程序使用用户控件。然后更改网站属性使用固定命名和单页组件。然后我们可以将用户控件dll用于多个应用程序