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

时间:2015-06-19 14:57:52

标签: c# html asp.net .net webforms

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

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

<add tagPrefix="Controls" namespace="Comp.UserWebControls.Controls" assembly="Comp.UserWebControls"  />

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

标记看起来像

<asp:Content ID="Content4" ContentPlaceHolderID="RightPlaceHolder" runat="server">
<Controls:uxMyControl ID="TestingThing" runat="server" />

在后面的代码中,&#34; TestingThing&#34;控件是实例化的,但所有属性都为空(标签,文本框等)

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

<add tagPrefix="Contols" tagName="uxMyControl" src="~/Controls/uxMyControl.ascx"/>

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

使用程序集时我无法执行src="myPath"所以我认为这与它有关。

如何将此控件分离到新的程序集/项目/解决方案,以便其他项目可以使用它。

任何帮助将不胜感激!

1 个答案:

答案 0 :(得分:3)

我认为您不能使用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. 部署应用程序以预编译它。
  6.   
  7. 抓住用户   由部署步骤生成的控件组装,您就是这样   基本上完成了:你有自定义控件。
  8.   
  9. 最后,使用你的   其他应用程序中的自定义控件与您始终使用自定义的方式相同   控件。
  10.   

如果您想拥有一组控件并且不想为每个控件分别使用单独的DLL,那么您可以使用反射器等反编译器来查看已生成的内容并将其复制/粘贴进入共享控件的类库。

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

你应该准备好了。

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

我认为您获得空值的原因很可能与viewstate和页面生命周期有关。这总是我在Webforms中最挣扎的事情,尤其是动态加载的控件,找出你应该加载它们的生命周期中的哪个位置。我似乎记得,如果你在Page_Load中动态添加它们,它们似乎总是有效,但从不会在回发中保持值,但是Page_Init工作正常。

所以我想说 - 创建一个自定义控件,一个用于用户控件的单个类文件,摆脱.ascx的任何痕迹,你应该好好去。