为什么我的用户控件不呈现?

时间:2011-09-26 09:28:10

标签: asp.net user-controls

我在vb.net中创建了一组用户控件,在原始项目中它们工作正常。

我已经创建了一个用户控件库dll,我希望在新项目中使用它。

我添加对dll的引用,在asp.net页面中指定标签库,并在页面上定义控件。

除了没有渲染输出外,一切似乎都有效。

控件的各种属性和page_load方法都被调用。

Asp.net跟踪显示页面层次结构等中的控件

控件应该没有输出 - 任何建议?

更新1

我只比较了工作输出与非工作输出相比的痕迹。

工作输出包含用户控件(及其中的所有元素) 非工作输出仅列出用户控件 - 无内容

因此似乎控件的内容以某种方式丢失 - 好像标记没有使用代码隐藏编译,只有代码隐藏似乎正在工作。

更新2

控件继承自UserControl而非控件。

2 个答案:

答案 0 :(得分:1)

我假设您在用户控件(.ascx)和自定义控件之间没有混淆。要使用户控件工作,需要ascx(标记文件)以及相应的代码隐藏类。用户控件通常由组成子控件组成,其子层次结构在提供某些UI的ascx文件中指定。在类库(dll)项目中,你不能打包ascx文件 - 你得到的只是代码隐藏类。如果没有ascx,代码隐藏类将不会有任何子控件,因此将呈现为空。简而言之,您无法将用户控件(ascx)打包到类库中 - 您必须将它们添加到实际的Web项目中。

对于共享控制,必须使用自定义控件。自定义控件是仅代码的,通常提供渲染覆盖,可以发出必要的html(或动态创建自己的子控件树)。这些控件可以作为类库打包并跨项目共享。通常,自定义控件还将具有其他辅助类以提供设计时辅助(UI编辑器等)。

答案 1 :(得分:1)

您在更新1-的摘要中是正确的,您的标记未包含在内!

如果你试图在.dll中分发.ascx控件,你需要提供一些肘部油脂,但不要太感激。

您需要做的两件事:

  1. 嵌入您的.ascx控件。 .ascx控件需要在.dll中标记为嵌入式资源(与'内容'相反)
  2. 创建VirtualPathProvider 。这将允许您直接从嵌入的dll中加载ascx文件。
  3. 不幸的是,解释第2步有点冗长,但是this excellent article帮助我完成了你想要做的事情。

    分发像这样的.ascx控件的美妙之处在于,你不必撕掉自己的头发来编写自定义控件(渲染任何东西而不是非常简单的html是一个噩梦才能理解)。