ASP.NET 控件集合的自动保存/加载模板服务器控件






4.55/5 (15投票s)
一个 ASP.NET 模板服务器控件,演示了如何存储/检索页面上各种 ASP.NET 控件的值。
引言
本文介绍了一个示例,展示了如何轻松设计一个 Web 服务器控件,该控件可以加载或读取 ASP.NET Controls
集合。这在需要保存用户在表单中选择的值,并在用户再次登录时自动加载回这些值的情况下非常有帮助。该控件可以处理任意数量的 Web 控件,并且顺序无关。您只需将所有需要加载/保存的控件包含在此控件的模板内即可。最棒的是,您无需在每个页面上单独配置控件要保存或恢复哪些控件,它会自动完成。
背景
最近,我的团队有一个需求,客户询问我们是否可以自动保存用户在特定屏幕上选择的搜索条件,并将其存储在用户个人资料下,以便下次用户访问同一屏幕时,无需重新进行相同的选择。这可以通过修改屏幕,在回发时将搜索条件存储在数据库中,并在首次加载屏幕时从数据库中加载它们来实现。但是,我们大约有 20-30 个这样的屏幕,这意味着大量的代码更改,而且这个需求是在用户验收培训/测试进行时提出的 :) 时间点很棒,对吧?
这时,我们想到了设计这个用户控件,效果非常好。得益于用户控件,我们在那些屏幕上只需做两件事:添加控件的引用,并将所有 ASP.NET 控件放入我们的用户控件内。只需要两行代码更改 :)
使用代码
我已附上服务器控件项目和使用此控件的 Web 项目。我们将一步一步地介绍如何重建该控件。
首先,创建一个 ASP.NET 服务器控件项目。我们将默认类重命名为 SmartFilter.vb 或您喜欢的任何名称(我们将其用于所有过滤控件,所以我命名为 filter)。从附件中复制代码到您的类中;您可能需要添加对 System.Design
的引用,因为它被 System.Web.UI.Design
所需要。
编译代码,并在您的 Web 项目中添加引用,然后查看示例 ASPX 页面,了解其用法。
现在,让我们看看代码是如何工作的。基本上,我们设计了一个模板服务器控件,以便可以在使用该控件的页面中定义模板的内容。但是,服务器控件将控制其模板内的所有控件,这使我们能够遍历所有这些控件,按类型识别它们,然后根据类型存储或恢复它们的值。也就是说,如果模板中的控件是文本框,那么我们知道可以通过 Text
属性获取或设置值。如果模板中的控件是下拉列表,那么我们知道需要查看 SelectedIndex
属性。同样,对于单选按钮和复选框控件,则是 Checked
属性。这样,我们就可以遍历模板中的所有控件,确定它们的类型,并采取行动来存储/恢复它们的值。
现在,由于该控件被多个屏幕使用,我们使用了两个键来存储用户选择的值:表单 ID 和用户 ID。这样,当用户在服务器控件的 Load
事件中访问特定屏幕时,我们会检查是否是回发;如果不是,我们会获取用户 ID 和表单 ID,并从数据库检索用户之前的选择。在此示例中,我将值存储在会话中并从中读取。您可以修改这部分,使其直接访问数据库。如果是回发,我们会从控件中获取值并将其存储在会话中。
让我们看看用于将用户选择存储在会话中的代码。如您所见,我们所做的就是遍历模板中的所有控件,确定它们的类型,并将它们的值存储在会话中。
同样,下面是在用户返回同一表单时从会话(或数据库)加载控件值的代码。我们同样在做同样的事情。首先,检查当前表单的会话中是否有任何值;如果有值,我们则遍历值数组并将它们加载到控件中。
现在,让我们看看将要使用此控件的实际 ASPX 页面。在该页面中,您只需引用服务器控件,并将所有您想要跟踪的控件包含在我们的服务器控件的模板中。如您所见,我们的 ASPX 页面只有最少的更改。此外,该页面也没有代码隐藏更改;这样,使用该控件的页面就不包含任何用于存储或恢复其中控件值的逻辑。
关注点
从这个示例中可以看出,模板控件为我们提供了很大的灵活性,我们可以为应用程序设计一些非常出色的功能。另一个优点是,实际使用该控件的页面甚至不知道保存是如何实现的。仍然有很大的改进空间;例如,我们可以为服务器控件添加一个属性,来说明我们是否需要对特定用户/页面启用保存功能。此外,我们可以自动为所有页面添加一些通用功能。在我们的案例中,我们自动为所有搜索条件添加了一个隐藏/显示按钮,以便用户可以隐藏/显示搜索条件,以节省屏幕上的空间。此更改最初在任何页面上都不存在,但我们很容易就添加了它,因为我们只需要将其添加到服务器控件中。