【问题标题】:Best way to share ASP.NET .ascx controls across different website applications?跨不同网站应用程序共享 ASP.NET .ascx 控件的最佳方式?
【发布时间】:2010-09-06 21:11:08
【问题描述】:

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

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

控件有 ASCX,后面带有 HTML + 代码。


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

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

谢谢!

【问题讨论】:

    标签: asp.net


    【解决方案1】:

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

    大问题:

    1. 母版页(以及设计器和 html 视图格式)无法处理引用的文件,因此您会失去很多功能。一个预构建步骤和大量 svn:ignore 条目是我对此的破解。让 CruiseControl.NET 在正确的文件夹中执行预构建任务也很痛苦。
    2. 共享页面/控件需要非常了解它们所接触和引用的内容,以避免引入额外的依赖关系。
    3. 两个站点被锁定在一起进行部署。
    4. 我现在必须祈祷维护者阅读我的小文档,了解我造成的混乱。这远远超出了我在 ASP.NET 项目中看到的范围。

    我承受着巨大的时间压力才能让它工作,它确实如此,现在这两个应用程序都在生产中。我不会推荐它,但如果您有兴趣,请从以下位置开始:

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

    【讨论】:

      【解决方案2】:

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

      【讨论】:

        【解决方案3】:

        【讨论】:

        • 伟大的文章,作品!如果你能总结一下文章的内容,你的答案会好很多。
        【解决方案4】:

        除了 Tundey 所说的之外,NTFS Link shell 扩展在其他独立项目之间共享大量内容(例如:带有 .ascx/.aspx 的文件夹)时很有帮助。如果是代码,我认为最好从 VCS 制作另一个工作副本。

        【讨论】:

          【解决方案5】:

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

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

          【讨论】:

          • 我查看了其中几个解决方案,如果您有现有的用户控件可以在网站之间共享,这是迄今为止最简单的。
          【解决方案6】:

          我首先牺牲了一些构建控件的便利性来做到这一点。

          您可以创建一个控件库项目,该项目将为您生成一个控件库 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 页面上。

          【讨论】:

            【解决方案7】:

            我注意到 ASP.Net 中的控件的最大问题是,在构建控件构建控件后,您无法轻松获得设计人员的支持。我能够做到这一点的唯一方法是创建一个没有代码隐藏的 .ascx 控件(即:所有服务器端代码都在具有 runat="server" 属性的 .ascx 文件中的脚本标记中) .

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

            【讨论】:

              【解决方案8】:

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

              【讨论】:

                【解决方案9】:

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

                【讨论】:

                  【解决方案10】:

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

                  【讨论】:

                    猜你喜欢
                    • 1970-01-01
                    • 1970-01-01
                    • 1970-01-01
                    • 1970-01-01
                    • 1970-01-01
                    • 1970-01-01
                    • 1970-01-01
                    • 1970-01-01
                    • 1970-01-01
                    相关资源
                    最近更新 更多