Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/asp.net/31.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
ASP.Net Web用户控件方法和事件在主机页的代码隐藏中不可用_Asp.net_Events_Methods_Virtual Directory_Webusercontrol - Fatal编程技术网

ASP.Net Web用户控件方法和事件在主机页的代码隐藏中不可用

ASP.Net Web用户控件方法和事件在主机页的代码隐藏中不可用,asp.net,events,methods,virtual-directory,webusercontrol,Asp.net,Events,Methods,Virtual Directory,Webusercontrol,我需要一个可以在多个项目中重用的验证工具,所以我决定将其作为Web用户控件。以下是我设置它所采取的步骤: 创建了一个新的web项目并添加了“我的web用户”控件 在IIS中,我将项目启用为应用程序,并将此新项目文件夹设置为将使用它的所有项目中的虚拟目录,并将每个虚拟目录启用为应用程序 对于每个使用该控件的项目,我添加了对dll的引用,并将该控件添加到该项目的web.config: <add tagPrefix="ut" src="~/UserControls/ValidateAcct.a

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

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

    <add tagPrefix="ut" src="~/UserControls/ValidateAcct.ascx" tagName="ValidateAcct" />
    
在运行时,Web用户控件中的内容将正确显示在主机页上,但从主机页的代码中,我无法调用为Web用户控件创建的任何方法。如果我完全从代码隐藏实例化控件,那么方法就在那里。我假设这是因为我只从dll工作,不涉及任何虚拟目录

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

<ut:ValidateAcct ID="valAcct" runat="server" />
    protected virtual void AccountValidated(object sender, EventArgs e) { }
再一次,从主机页的代码隐藏中,我无法访问此事件。我想也许我可以在代码后面实例化控件来访问事件,就像我对方法所做的那样,但即使这样也不起作用


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

您不需要设置web目录来跨项目共享代码。
事实上,这是一种非常错误的方法

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

  • 按照通常的方式编写用户控件,通常使用 VisualStudioDesigner
  • 在尝试部署它之前,使用一个简单的页面测试它
  • 部署应用程序以预编译它
  • 抓取部署步骤生成的用户控件的程序集, 基本上完成了:您有了自定义控件
  • 最后,以与您相同的方式在其他应用程序中使用自定义控件 始终使用自定义控件的
  • 本主题中还有一个包含一些MSBuild自动化特性的主题。

    我会先尝试它,因为这似乎是一种更简单的方法,但我不能100%确定它是否有效。

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

    public event EventHandler AccountValidated;
    

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

    您无法将Web用户控件添加到类库中。我不希望在代码隐藏中实例化控件,我希望能够通过主机页的标记添加它。另外,虽然我在其中创建控件的项目不是类库,但我已经在项目中引用了已编译的DLL。你错了。。。请检查这个!哦看来我错了。删除我的答案直到我了解一点。@Dan:不,你是对的,tjc59是错的:可以构建Web控件库并在标记中实例化控件。检查[此示例](webproject.scottgu.com/CSharp/UserControls/UserControls.aspx)@Alex:VS2008+中似乎没有Web控件库模板。另外,这个解决方案使用了一个共享文件夹,这是一种痛苦(虽然因为OP目前也这样做,这可能对他有帮助)。我刚刚编辑了你的问题,并将HTML标记转换为Markdown,这是StackOverflow的标准。请在将来尝试使用它。谢谢