ViewManager:一个灵活的视图管理工具

在现代Web开发中,经常需要根据不同的用户角色或状态来展示不同的视图。例如,一个表单可能需要为管理员和普通用户展示不同的界面。传统的方法是使用多个页面或者复杂的JavaScript逻辑来实现这种需求,但这往往会导致代码的冗余和难以维护。为了解决这个问题,开发了一个名为ViewManager的工具,它允许开发者在一个Web表单中管理多个视图和控件,使得视图管理变得简单而高效。

在工作中,经常遇到需要同时管理多个对象可见性的代码。这些Web表单试图给人一种它们是两个或三个不同页面的错觉,而实际上它们只是一个页面。个人更倾向于将这些页面分开,但需要一个中间步骤来重构代码(因为代码背后的逻辑可能超过一千行,所以喜欢分步骤进行,以便更彻底地测试)。

那么,该怎么做呢?可以使用面板或视图控件。视图控件在视图管理方面比面板有优势,但如果有些控件属于多个视图怎么办?如果构成视图的控件是交错的怎么办?这就是ViewManager类发挥作用的地方。

使用代码

好的,有这个类,但如何使用它呢?经常看到其他程序员提供的类,它们做了很多事情,但留给很多思考的空间,以至于它们几乎是无用的。将尽最大的努力尽可能简单地分解它。

在示例项目中,是如何切换到编辑模式和只读模式的:

protected void EditButton_Click(object sender, EventArgs e) { MyViewManager.SetActiveView(EditCustomerViewName); } protected void SaveButton_Click(object sender, EventArgs e) { MyViewManager.SetActiveView(ViewCustomerViewName); }

其中EditCustomerViewName和ViewCustomerViewName是字符串变量,它们分别持有每个视图的名称。将它们设置为全局变量,以便在整个Page类中不同方法可以访问相同的名称,而不需要重复字符串。

最复杂的部分是将每个视图与其子控件关联起来。以下是是如何做的。将首先展示是如何将编辑控件关联起来的。

protected void InitializeViews() { MyViewManager = new ViewManager(); List EditableCustNames = new List(); EditableCustNames.Add(FirstNameField); EditableCustNames.Add(MiddleInitialField); EditableCustNames.Add(LastNameField); MyViewManager.Add(EditCustomerViewName, SaveButton); // 注意,也可以像下面这样使用现成的列表来填充视图。 MyViewManager.Add(EditCustomerViewName, EditableCustNames); }

创建了一个名为InitializeViews的方法。这给了一个中心位置,可以在这里设置ViewManager(这也是在整个Page类中全局可访问的)。接下来,创建了一个控件列表。这样做只是为了逻辑上将控件分组。在这个例子中,列表中的每个控件都是用于编辑客户名称的控件。不必通过列表添加控件。还有一个重载版本可以处理将控件逐个分配给每个视图,就像在示例的最后一行看到的那样。

再次强调,EditCustomerViewName只是一个字符串。完全可以用实际的字符串"Edit Customer"替换变量。选择使用变量的原因是拼写至关重要。视图不是强类型的,所以不会知道任何错误,直到运行时。所以再次强调,在代码中只打一次视图名称(或使用结构),并通过变量名引用,使其成为强类型。

基本上就是这样。如果愿意,也可以删除视图。在这个例子中没有这样做,但调用MyViewManager.RemoveView(EditCustomerViewName)就像调用它一样简单。

感兴趣的点

这个类本身利用了一个Dictionary对象,它包含与强类型List(List)关联的键。幸运的是,C#在控制列表和控件之间保持了引用,所以对列表中的一个控件的更改就像对控件本身的更改一样好。

另一个附带说明...

当一个控件被添加到视图中时,它的Visible属性被设置为false。基本上,如果不明确设置一个视图为活动状态,那么视图就被认为是非活动的。另一个需要注意的是,一次只能有一个视图处于活动状态。鉴于可以将控件重叠到多个视图中,这不应该是一个限制因素,但只是提醒这个类的假设。

还有另一个...

写了这篇更全面的文章,是因为有人在一篇更简短的文章上发表了评论。原始文章只针对中级到高级开发者,因为使用了单元测试来记录代码,并希望开发者利用这一点。希望这能帮助更多的人使用这个伟大的工具。

沪ICP备2024098111号-1
上海秋旦网络科技中心:上海市奉贤区金大公路8218号1幢 联系电话:17898875485