ASP.NET 中的动态用户控件

4

你好,我想学习如何在asp.net中创建动态用户控件。

我只知道此类控件是在运行时创建或加载的。

有人知道关于这个主题的好教程吗?

提前感谢,

4个回答

6
你在ASP.Net WebForms中学习动态控件最好的方法是避免使用它们。ASP.net中的动态控件充满了陷阱。我几乎总是推荐以下替代方案之一:
  • 在页面上放置合理数量的固定控件,然后仅显示所需的控件。
  • 找出动态控件的来源并将其抽象为数据源(数组,ienumerable,list等),即使只是调用Enumerable.Range()也可以将其绑定到重复器。
  • 构建一个用户控件,输出所需的HTML,跳过此内容的整个“控件”比喻。

如果你真的必须使用动态控件,则需要牢记HTTP的无状态特性以及asp.net页面生命周期。每个都增加了使动态控件工作的难点:前者需要在每次回发时创建或重新创建控件,而后者则需要在命中页面加载事件之前完成此操作-通常在页面初始化或预初始化中。


4
通常人们在这里谈论的是动态实例化并将控件添加到占位符中。
例如:
Control ControlInstance = LoadControl("MyControl.ascx");
myPlaceholder.Controls.Add(ControlInstance);

以上代码实例化了MyControl.ascx,并将其放置在id为myPlaceholder的占位符中。

1

我同意@Joel的观点,通过了解页面生命周期、无状态性等,可以避免陷阱。需要注意的主要事项包括:

  1. Page_Init - 在此处初始化页面上的控件,因为它们是上次呈现页面时的状态。这很重要,因为ViewState在Init之后运行,并且需要以与先前呈现方式相同的方式初始化相同的控件。您可以使用@Mitchel的代码加载控件,例如:

    Control ControlInstance = LoadControl("MyControl.ascx"); myPlaceholder.Controls.Add(ControlInstance);

  2. Page_Load - 在此处加载控件的内容,就像加载任何未动态加载的控件一样。如果您在page_init中保留了对它们的引用,则它们将在此处可用。

遵循这个结构,我没有遇到太多困难,因为这似乎是ASP.NET设计工作的方式,即使MSDN上的所有示例都不是这样做的。然后,您需要注意跟踪页面在控件渲染方面的状态。

在我的情况下,我需要获取多页调查的部分编号并从数据库重新加载问题,所以我所要做的就是跟踪当前呈现的部分编号,这并不困难。
话虽如此,如果你只是为了在同一屏幕上显示和隐藏不同的视图而使用动态控件,那么我建议你不要使用它们。在这种情况下,我宁愿使用用户控件(隐藏不必要的内容)、标记尚未呈现的区域的占位符或者单独的页面/视图等,这样你可以将页面保持单一职责,这使得调试和/或获得有用信息更加容易,例如用户所处的页面。

0

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