开发可重用的程序逻辑时,第一步就是尽量减少服务器脚本页中的代码数量。脚本页中的逻辑很难(有时甚至不可能)重用,造成视图和控制器分离得不够好。另外,它的测试和调试也显得异常困难。所以,不要将脚本代码添加到一个.aspx页中,更有效的做法是使用类来实现控制器。这样可在整个Web应用程序中统一外观和导航机制,并可在整个应用程序的范围内重用表示(呈现)逻辑。
实现ASP.NET应用程序的控制类时,可采用两种不同的模式。在用Page Controller模式构建的应用程序中,导航模式是静态的,但网页是动态生成的。对于更复杂的应用程序,如果导航是动态的,或者要求根据一个规则集(例如用户权限或应用程序状态)来配置,那么使用Front Controller模式可获得一个更有效的实现。下面将详细讨论这两种模式。
使用Page Controller模式时,要由名为BaseController的一个中心类来实现需要的所有公共行为,以便处理HTTP请求、更新模型以及将请求转发给恰当的视图。BaseController提供的通用功能包括会话管理、安全性以及从查询字符串或隐藏字段中检索数据。针对Web应用程序中的每个链接,你都需要创建一个独立的PageController类,该类要从BaseController类继承。这些独立的PageController负责实现网页特有的任何行为,并直接使用已由BaseController实现的核心功能。
许多时候,你的应用程序可以分解成一系列公共网页类型,它们共享通用的逻辑。例如,你可能有一系列数据输入页或者网格视图页,它们全部共享相同的逻辑。在这种情况下,最好实现一个DataEntryController或者一个GridViewController,并要求它们从BaseController类继承。基于这些派生类,你可实现自己PageController,并使用现成的公共方法。但要注意的是,继承层次不能太复杂,否则应用程序逻辑会变得难以维护。为了尽量缩短继承链,你可创建一系列“助手类”,它们含有一系列公共代码,可在任何一个继承级别上调用。
为了实现Page Controller模式,你可从System.Web.UI.Page继承一个BaseController类,然后实现通用的应用程序功能。例如,BaseController可提供页眉、页脚和一些用户特有的信息(例如登录名称和部门等),从而实现一致的外观与感觉。接着可从这个BaseController类继承,并由继承的类(放在代码隐藏文件中)来实现网页所特有的逻辑,从而创建应用程序需要的每一个页。对于中等复杂程度的应用程序,如果它具有固定的导航路径,就尤其适合采用这一模式。相反,如果需要动态导航能力,则需要采用Front
Controller模式。