1

我需要一个可以在多个项目中重复使用的验证工具,因此我决定将其设为 Web 用户控件。以下是我设置它的步骤:

  • 创建了一个新的 Web 项目并添加了我的 Web 用户控件。
  • 在 IIS 中,我将项目启用为应用程序,并将这个新项目文件夹设置为将使用它的所有项目中的虚拟目录,并将每个虚拟目录启用为应用程序。
  • 对于使用该控件的每个项目,我添加了对 dll 的引用,并将控件添加到该项目的web.config

    <add tagPrefix="ut" src="~/UserControls/ValidateAcct.ascx" tagName="ValidateAcct" />
    

    注意:'UserControls'是一个虚拟目录,实际上并不存在于每个宿主项目中。

  • 然后我将控件添加到主机页面:

    <ut:ValidateAcct ID="valAcct" runat="server" />
    

在运行时,来自 Web 用户控件的内容正确显示在主机页面上,但从主机页面的代码隐藏中,我无法调用我为 Web 用户控件创建的任何方法。如果我完全从代码隐藏中实例化控件,则方法就在那里。我认为这是因为我仅使用 dll 工作,并且不涉及任何虚拟目录。

我遇到的另一个问题是事件。我在 Web 用户控件上创建了以下事件,我想在我的主机页面上处理它:

    protected virtual void AccountValidated(object sender, EventArgs e) { }

再一次,从主机页面的代码隐藏中,我无法访问此事件。我想也许我可以在代码隐藏中实例化控件来访问事件,就像我对方法所做的那样,但即使这样也没有用。

这里的目标是我希望这个用户控件被一个网站中的多个项目使用,但只需要维护一份控件/代码的副本。这就是我选择虚拟目录路线的原因,但我觉得这是我所有问题的原因。任何人都可以提供任何帮助将不胜感激!

4

2 回答 2

2

您需要在用户控件中创建事件事件处理程序,以便您可以在页面上冒泡事件。

public event EventHandler AccountValidated;

至于您的第二个问题,您能否检查 Designer.cs 文件并确保用户控件类型为ValidateAcct。如果它不是 ValidateAcct,而只是 UserControl,那么这就是您看不到您创建的任何方法的原因。

于 2011-08-09T20:55:10.710 回答
1

您无需设置 Web 目录即可跨项目共享代码。
事实上,这是一种非常错误的做法。

共享用户控件确实很棘手,但如果您遵循以下说明,您将会成功:

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

还有另一个关于这个主题的帖子,其中包含一些 MSBuild 自动化优点。
我会先尝试一下,因为它似乎是一种更简单的方法,但我不能 100% 确定它是否有效。

于 2011-08-09T20:28:55.137 回答