在现代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
另一个附带说明...
当一个控件被添加到视图中时,它的Visible属性被设置为false。基本上,如果不明确设置一个视图为活动状态,那么视图就被认为是非活动的。另一个需要注意的是,一次只能有一个视图处于活动状态。鉴于可以将控件重叠到多个视图中,这不应该是一个限制因素,但只是提醒这个类的假设。
还有另一个...
写了这篇更全面的文章,是因为有人在一篇更简短的文章上发表了评论。原始文章只针对中级到高级开发者,因为使用了单元测试来记录代码,并希望开发者利用这一点。希望这能帮助更多的人使用这个伟大的工具。