从另一个项目/ dll引用的Asp.NET用户控件具有NULL属性

Jer*_*old 6 .net html c# asp.net webforms

尝试将常用自定义控件移动到新的类库(也尝试了新的Web项目),以便其他项目可以使用它,但在其他项目中使用时,其属性始终为NULL.不幸的是,搜索类似的问题无助于解决我的问题.

我将web.base.config中的新控件注册到Project-A

<add tagPrefix="Controls" namespace="Comp.UserWebControls.Controls" assembly="Comp.UserWebControls"  />
Run Code Online (Sandbox Code Playgroud)

Comp.UserWebControls作为Project-A中的项目引用添加(我也尝试在Project-A中添加build dll作为引用,没有区别)

标记看起来像

<asp:Content ID="Content4" ContentPlaceHolderID="RightPlaceHolder" runat="server">
<Controls:uxMyControl ID="TestingThing" runat="server" />
Run Code Online (Sandbox Code Playgroud)

在后面的代码中,实例化了"TestingThing"控件,但所有属性都为null(标签,文本框等)

通常,如果控件在同一个项目(Project-A)中,那么我会像这样注册控件:

<add tagPrefix="Contols" tagName="uxMyControl" src="~/Controls/uxMyControl.ascx"/>
Run Code Online (Sandbox Code Playgroud)

在代码隐藏中,控件对象看起来很好,属性被实例化并按预期工作.

我不能src="myPath"在使用组件时这样做,所以我觉得它与它有关.

如何将此控件分离到新的装配/项目/解决方案,以便其他项目可以使用它.

任何帮助将不胜感激!

bgs*_*264 4

我认为您不能将User Control(例如 .ascx 文件)放入类库中以便在不同的应用程序之间共享。

相反,您需要编写一个Custom Control. 这基本上是一个类(单个 .cs 文件,没有关联的 ascx),它派生自Control(或派生自Control- 例如,DropDownList如果您想创建自己的自定义下拉列表控件,则可以派生自)。

差异:https://msdn.microsoft.com/en-us/library/aa651710 (v=vs.71).aspx

这里还有另一篇 MSDN 文章: https: //msdn.microsoft.com/en-us/library/aa479318.aspx,其中讨论了如果您对以下想法不太满意,如何从用户控件创建自定义控件它。

它概述了以下步骤:

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

如果您想要一组控件并且不希望每个控件都有一个单独的 DLL,那么您可以使用反编译器(例如 Reflector)来查看生成的内容,然后将其复制/粘贴到共享控件的类库中。

然后,您应该能够注册 tagPrefix 和命名空间,如您已经所示: <add tagPrefix="Controls" namespace="Comp.UserWebControls.Controls" assembly="Comp.UserWebControls" />

你应该准备好出发了。

如果用户控件不是特别复杂,那么我可能会想阅读有关纯代码的内容Custom Controls,并尝试像这样编写它,而不是尝试获取和反编译 DLL。

我认为您返回空值的原因很可能与视图状态和页面生命周期有关。这一直是我在 Webforms 中最困扰的事情,尤其是动态加载的控件,弄清楚应该在生命周期的哪个位置加载它们。我似乎记得,Page_Load例如,如果您动态添加它们,它们似乎总是可以工作,但不会在回发中保留值,但随后Page_Init工作得很好。

所以我想说 - 创建一个自定义控件,为用户控件创建一个类文件,清除任何痕迹,.ascx然后就可以开始了。