【问题标题】:How do I share user controls between web applications in ASP.NET?如何在 ASP.NET 中的 Web 应用程序之间共享用户控件?
【发布时间】:2010-10-17 03:23:15
【问题描述】:

这个问题是我关于sharing resources between web applications 的问题的后续,因为我还没有找到好的解决方案。

我有一个 Web 应用程序,其中包含由其他三个 Web 应用程序共享的用户控件和资源。

解决方案 | +-CommonControlsWebApp | +- 资源 | | +- 图片 | | +- 脚本 | | +- 样式表 | +- 用户控件 | +-WebApp1 | +-WebApp2 | +-WebApp3

这是我目前所知道的:

  • 我无法将 CommonControlsWebApp 编译成单个 dll,因为我正在创建用户控件。这仅适用于自定义服务器控件,其中所有内容都在代码隐藏文件中。所以我需要一种在四个项目之间共享 ascx 文件的方法。
  • 将文件从 CommonControlsWebApp 复制到其他三个项目不会更新解决方案资源管理器中的文件。当在 CommonControls 中添加或重命名文件时,我必须在所有三个 WebApp 中都“添加扩展项”。
  • 更改为网站模型可以解决此问题,但如果我这样做,我担心 WebApp1-3 的编译时间。
  • “添加为链接”不适用于目录。
  • 我可以使用 Subversion 在项目之间共享文件,但我相信如果我正在开发一个我必须通过其中一个测试的用户控件,这将需要我一直重新签入和签出文件网络应用程序。

ASP.NET 真的没有一个好的解决方案吗?你们是如何组织大型网络应用程序的?

编辑:非常感谢所有的答案。我现在将使用构建事件复制我的用户控件,然后看看我们是否有时间将它们重构为服务器控件。

【问题讨论】:

    标签: asp.net visual-studio-2008 web-applications user-controls resources


    【解决方案1】:

    在我现在的公司,我们这样做的方式是确保 CommonControlsWebApp 是一个 WebApplication,而不是一个网站。然后,您使用有助于将其识别为不同于单个 Web 应用程序的常见文件夹的名称。 (CommonUserControls 而不仅仅是 UserControls)

    在您的其他 Web 应用程序中,您为 CommonUserControls 等创建一个虚拟目录,并向 CommonControlsWebApp.dll 添加基于文件的引用

    这需要您使用 IIS 进行开发(而不是 casini),Visual Studio 不会相信控件确实存在,但它会在运行时工作,并且您可以构建得很好,只需要警告 blahblah.ascx 或blahblah.master 路径无效。

    如果您确实使用通用母版页和 Visual Studio 2008,则需要 SP1 for 2008 并在各个 Web 项目的根目录中使用 __fallback.master 以进入设计模式。

    但是,我在另一个线程上看到了这个,我将考虑做更多这样的事情: http://webproject.scottgu.com/CSharp/UserControls/UserControls.aspx

    【讨论】:

    • 使用链接中 ScottGu 建议的方法。
    【解决方案2】:

    你可以把它编译成一个dll

    Turning an .ascx User Control into a Redistributable Custom Control

    步骤概要

    实现这一目标的基本步骤 如下:

    1. 像往常一样编写用户控件,通常使用 Visual Studio 设计器。
    2. 在尝试部署之前使用一个简单的页面对其进行测试。
    3. 部署应用程序以对其进行预编译。
    4. 获取部署步骤生成的用户控件程序集,然后 你基本上完成了:你有你的 自定义控件。
    5. 最后,在其他应用中使用您的自定义控件

    更多信息在这里http://www.nathanblevins.com/Articles/Compile-a-Web-User-Control-into-a-DLL-.Net-c-.aspx

    【讨论】:

      【解决方案3】:

      为了在网络应用程序之间共享控件,我发现的唯一方法是将它们重写到服务器控件中,或者使用虚拟目录使用户控件实际上在文件夹中位于每个项目中。

      不幸的是,asp.net 并没有很好的解决方案。共享母版页也是如此。

      【讨论】:

        【解决方案4】:

        您可以考虑使用源代码控制并在该级别共享您的控制。我们为一个相当大的用户控件库执行此操作,并且效果很好。

        使用 SourceGear Vault,但您应该能够使用任何源代码控制产品执行此操作。

        【讨论】:

        • 但这不会要求我提交在库中所做的任何更改以使其在其他项目中可用吗?
        • 是的。它们要么在项目之间共享,要么被复制。不能两全其美。
        • 如果您不希望它们全部共享,它们有一个“共享控件”文件夹和一个(非共享)“控件”文件夹。
        【解决方案5】:

        查看this 帖子了解如何解决此问题。

        基本想法是更改您的项目,使其具有一个预构建步骤,将 .ascx 文件复制到 Web 应用程序的子目录中。然后在使用它们时参考这些副本。当然,您还需要引用 UserControls 程序集。

        【讨论】:

          【解决方案6】:

          一个选项是尝试“添加现有”,然后在出现的对话框中,“确定”按钮旁边有一个下拉箭头,将其更改为带有链接的添加。

          如果这不起作用,请将您的控件重写为自定义控件。

          这需要一点时间,但将来会使其更易于维护。

          【讨论】:

            【解决方案7】:

            嘿,这不是最好的做事方式,但我曾经在我的 asp.net 1.1 天里这样做 - 你可以试试这个 - 将你的用户控件转移到一个单独的项目中,并将这个项目发布为一个虚拟目录iis

            只要您不使用代码隐藏 - 您的更新会很酷(仅更新共享用户控制文件夹)

            如果您确实使用代码隐藏 - 将用户控件 dll 重新部署到不同的项目中


            完成后 - 使用虚拟路径将这些用户控件映射到所有项目中

            检查这些链接 - http://aspadvice.com/blogs/ssmith/archive/2006/10/05/Tip_3A00_-Share-User-Controls-Between-Applications-in-ASP.NET.aspx

            http://www.123aspx.com/redir.aspx?res=30887

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2011-04-25
              • 1970-01-01
              • 2015-06-15
              • 1970-01-01
              • 1970-01-01
              • 2014-08-30
              相关资源
              最近更新 更多