我正在使用 WebForms 设计/构建一个中等规模的 ASP.NET Web 应用程序。该项目的主要工作是构建每个 Web 表单,我不知道如何设计(在代码/数据/数据流意义上)我的控件。
我会给你一些我正在处理的例子,这样你就可以理解我的意思:
应用程序中的一项常见任务是输入和显示街道地址。因此,我创建了一个名为“AddressFields”的用户控件,其中包含一系列 HtmlInputText 元素(一个用于第 1 行,另一个用于城镇/城市、国家/地区、邮政编码等)。我的数据库实体类包含一个名为“地址”的类,因此该控件具有以下方法:
- void ShowAddress(Address addr) - 用适当的文本填充 HtmlInputText 元素)。
- void UpdateAddress(Address addr) - 使用 HtmlInputText 元素的当前内容更新 addr 的内容
- Address CreateAddress() - 创建一个新的 Address 实例,然后将其传递给 UpdateAddress,然后返回它
到目前为止,一切都很好。这是有效的,因为 AddressFields 控件是“愚蠢的”,它所做的只是向用户显示和检索数据。ViewState 也直接由 HtmlInputText 字段管理,因此不需要额外的逻辑。
我的应用程序中的另一个实体是“客户端”,它是一个具有地址属性的类,但这个类也有一些更复杂的方面。例如,客户有一系列可以分配的标签(我的应用程序中的“类别”)。在本例中,我设计了 ASP.NET CheckboxList 控件的子类。
我创建了另一个名为“ClientFields”的 UserControl,其中包含显示客户端信息的所有必要字段(包括 AddressFields 控件),但它还包括名为“CategoryList”的 CheckboxList 子类。
这里的问题是需要将 CategoryList 控件提供给要显示的数据(但不是在回发时,因为它使用视图状态)。在这种情况下,我的问题是:谁负责连接数据库并检索类别列表?
它是 CategoryList 控件吗?(如果是这样,它在控件生命周期中的哪个位置查询数据库?它不能在 Control.Load 中执行,因为它发生在 ClientFields 被填充之后。它发生在 ClientFields 本身中吗?(再次,然后在生命周期中的哪个位置是否会发生这种情况,因为 ClientFields 在 Page.Load 中调用了 ShowClient(Client c) 方法。另一种方法是从 ClientFields 中公开 CategoryList,以便页面可以直接访问它,但这违反了良好的软件设计。