ASP.NET UserControl 类库

10

是否可以创建包含用户界面控件(UserControls)的类库以便重用? 如果可以,怎么做? 标记语言(markup) 是否随着 .dll 文件一起编译? 感谢任何帮助!


@Mike C. 给我的回答添加了更新,请查看。 - eglasius
6个回答

9
您可以将UserControlPage编译成类库,因为在您的网站经过及时编译后,这就是最终结果。这个过程有点复杂,因为UserControlPage实际上并不适用于跨应用程序使用。
来自MSDN:

UserControl使您能够创建可在应用程序或组织内多处使用的控件

http://msdn.microsoft.com/en-us/library/system.windows.forms.usercontrol.aspx

对于将要在多个应用程序中使用的控件,首选方法是创建自定义Web服务器控件
如果您真的想坚持使用UserControl,则获得此功能的基本过程如下:
  1. 创建一个新的Web应用程序项目
  2. 开发可重用的UserControl
  3. 将网站发布为不可更新*的网站。(取消选中“允许此网站可更新”)
  4. 从已发布的网站中的bin目录复制编译后的库和需要的ascx文件到新网站中。

    • 不可更新选项是将标记带入程序集的方式。这是一个重要的步骤。

是的,正如第四点所述,您需要复制ascx文件。标记将包含在类库中,而ascx实际上将为空。除非使用自定义Web服务器控件,否则无法避免这种情况,因为通过它们的文件名将UserControl添加到Page中。

所有这些都在MSDN上有更详细的文档说明。

http://msdn.microsoft.com/en-us/library/aa479564.aspx


我按照步骤进行了操作,但在将程序集集成到我的网站时遇到了问题。我设置了“不可更新”选项,并在我的新项目中引用了.dll文件。但我无法弄清楚如何在我的页面上实际声明它。 - Mike Cole
1
这只是我一个人的问题,还是这个方法仍然需要您部署标记.ascx文件?“1.从构建[...]中复制相应的.aspx/.ascx文件”。 - Radu094
你仍然需要物理文件在那里,尽管它们会是空的。 - Bob

7

更新:我在使用预编译的用户控件时给出的提示是正确的,就像使用普通用户控件一样。

具体步骤请参见将.ascx用户控件转换为可重新分发的自定义控件

在您使用它的项目中不需要任何.ascx文件,因此完全符合您的要求。


用户控件并不适用于在多个站点之间重复使用,请使用自定义服务器控件

您可以使用现有控件组合服务器控件,并设置所有内容以便通过css进行样式设置。

如果您仍然想采用用户控件方法,请尝试Bob在答案中提到的方法。虽然我没有使用过用户控件,但我认为可以像使用自定义服务器控件一样使用该方法的输出。

<%@ Register TagPrefix="aspSample" Namespace="Samples.AspNet.CS.Controls"%>
...
<aspSample:WelcomeLabel Text="Hello" NameForAnonymousUser="Guest" 
   ID="WelcomeLabel1" runat="server" BackColor="Wheat" ForeColor="SaddleBrown" />

顺便提一下,如果那不起作用,他提供的链接会告诉你无论如何都要复制ascx文件,所以那可能不是你要找的东西,即尝试上述方法,如果不行就坚持使用自定义服务器控件。


@boon 哎呀,我本来想说的是跨站点 - 这一点在原帖的问题中已经很明确了 ;) - eglasius

1

你可能想要查看服务器控件。据我所知,你无法将用户控件编译成单个DLL。


1
如果我们谈论的是Web表单,答案是否定的。标记(.ascx文件内容)不会编译到dll中。ASP.NET引擎期望在文件系统中找到此文件,以及Web应用程序。因此,不可能创建一个可以简单重新分发或共享的DLL。
如果您想创建可跨Web应用程序共享的控件,可以创建自定义控件,但是您必须使用.net代码编写HTML(最好使用适当的任务类而不仅仅是在文本中创建HTML),如果控件很大,则可能会变得非常丑陋。
个人而言,我认为这种方式相当烦人。
然而,我认为如果您正在使用ASP.NET MVC,则有一些可能性(取决于您的视图引擎),但我对MVC没有太多经验。

答案不是“不”,请看我的回答。 - Bob
1
@bob,你的回答没有提供一个包含嵌入式用户控件的类库(例如一个dll),而是一堆dll和相应的ascx文件。你仍然需要将这些文件放置在目标Web应用程序中才能使用这些控件。因此,按照问题的措辞来说,答案是否定的。 不过,你的回答可能是一个不错的替代方案。 - Pete
文件内容会被编译成dll。您需要ascx文件作为占位符。有多个DLL取决于项目的结构。没有理由不能合并成一个。 - Bob
最好使用适当的类来完成任务,而不是仅仅在文本中创建HTML。-- 你能给我一个快速的解释,以便我开始正确地工作吗?谢谢! - Mike Cole

0

听起来你需要自定义服务器控件。

如果你的控件是其他服务器控件的组合(例如,一个文本框和一个按钮用于日期控件),那么你可以看看CompositeDataBoundControl和CompositeControl - 这些都是处理这种情况的方便方法。

但要注意,页面周期/视图状态重新加载的工作方式很容易让人感到困惑。由于对其应该如何工作的微妙误解,我已经浪费了相当多的时间。

http://aspnetresources.com/blog/composite_databound_control.aspx


0

您可以从dll中提供用户控件。 您只需要创建一个自定义VirtualPathProvider来加载控件。 这基本上就是SharePoint所做的。

这是微软的一篇文章,解释了该过程:

http://support.microsoft.com/kb/910441

您也可以搜索“VirtualPathProvider”。

此示例从数据库加载代码,但您可以修改它以从程序集中作为嵌入资源加载代码。我们在公司中这样做是为了在许多站点和应用程序域之间共享主页面。

但要注意一点,这在中等信任环境中不起作用。因此,如果您计划将其部署到共享托管环境中,请先在您的主机上进行测试以查看它是否有效。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接