尝试将公共自定义控件移动到新的类库(也尝试了新的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"
所以我认为这与它有关。
如何将此控件分离到新的程序集/项目/解决方案,以便其他项目可以使用它。
任何帮助将不胜感激!
答案 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讨论了如果您对用户控件感觉不太满意,如何从用户控件创建自定义控件。
它概述了以下步骤:
- 像往常一样编写用户控件,通常使用 Visual Studio设计师。
- 在尝试之前使用简单页面对其进行测试 部署它。
- 部署应用程序以预编译它。
- 抓住用户 由部署步骤生成的控件组装,您就是这样 基本上完成了:你有自定义控件。
- 最后,使用你的 其他应用程序中的自定义控件与您始终使用自定义的方式相同 控件。
醇>
如果您想拥有一组控件并且不想为每个控件分别使用单独的DLL,那么您可以使用反射器等反编译器来查看已生成的内容并将其复制/粘贴进入共享控件的类库。
然后您应该能够注册tagPrefix和命名空间,如您所示:
<add tagPrefix="Controls" namespace="Comp.UserWebControls.Controls" assembly="Comp.UserWebControls" />
你应该准备好了。
如果用户控件不是特别复杂,那么我可能会想要阅读有关纯代码Custom Controls
的内容并试着像这样写它而不是试图抓住它反编译DLL。
我认为您获得空值的原因很可能与viewstate和页面生命周期有关。这总是我在Webforms中最挣扎的事情,尤其是动态加载的控件,找出你应该加载它们的生命周期中的哪个位置。我似乎记得,如果你在Page_Load
中动态添加它们,它们似乎总是有效,但从不会在回发中保持值,但是Page_Init
工作正常。
所以我想说 - 创建一个自定义控件,一个用于用户控件的单个类文件,摆脱.ascx
的任何痕迹,你应该好好去。