l = "Hello, " + name.Text + ".";
}
}
此代码的用途是通知页面控制器:当用户单击按钮后,将向服务器发送一个请求,并执行 SubmitBtn_Click 函数。
此实现显示了连接到控制器所提供的事件是多么简单。它还说明,用这种方式编写的代码更易于理解,因为应用程序逻辑没有与管理事件调度的低级代码结合起来。
公用外观示例
下面的示例使用页面控制器的典型实现策略来提供显示动态内容的横幅,该横幅在应用程序的每一页上显示已验证的用户的电子邮件地址(该地址是从数据库检索的)。
站点内的所有页面对象所继承的基类中包含了公用实现。图 3 显示了站点中的一个网页。
图 3: 显示动态内容的横幅
站点中的各个页面负责呈现自己的内容,而基类则负责呈现头信息。因为各个页面是从基类继承的,所以它们都具有相同的功能。
此实现使用了称为 Template Method的设计模式。该模式在一个操作中定义了一个算法的框架,而将一些步骤交给子类完成。Template Method 允许子类重新定义算法的某些步骤,而不必更改该算法的结构。 [Gamma95]
将 Template Method 应用于此问题需要将公用代码从各个页面移到一个基类中。这样可以确保公用代码放在一个地方,并且很容易维护。在此示例中,基类名为 BasePage 并负责将 Page_Load 方法连接到 Load 事件。与 BasePage 相关的工作(即从数据库检索用户的电子邮件地址和设置站点名)完成后,Page_Load 函数将调用名为 PageLoadEvent 的方法。子类实现 PageLoadEvent,以执行它们自己的特定 Load 功能。图 4 显示了此解决方案的结构。
图 4: 代码隐藏页面实现的结构
请求网页时,ASP.NET 运行库会触发 Load 事件,该事件再调用 BasePage 的 Page_Load 方法。BasePage 方法检索所需数据,然后对所请求的特定页面调用 PageLoadEvent,以执行任何与页面相关的所需加载。图 5 显示了页面请求序列。
图 5: 页面请求序列
通过以这种方式实现公用功能,页面不必设置头信息,并且还可以很容易地进行整个站点的更改。如果头信息呈现和初始化代码不包含在一个文件中,则必须对包含与头信息有关的代码的所有文件进行更改。
BasePage.cs
基类代码实现了以下功能:
将 Load 事件连接到 Page_Load 方法,以便进行与请求具体相关的初始化。
从请求上下文检索已验证的用户的名字,并使用 DatabaseGateway 类在数据库中查找该用户的记录。该代码将 eMail 标签分配给用户的电子邮件地址。
将站点名分配给 siteName 标签。
调用 PageLoadEvent 方法,可以由派生类实现该方法以进行任何与页面相关的加载。
注意:最好将 BasePage 类定义为抽象类,因为这样可以强制实现者提供 PageLoadEvent 的实现。不过,在 Microsoft Visual Studio® .NET 中,不可能将此基类定义为抽象类。相反,该类提供可由派生类覆盖的默认实现。
using System;
using System.Web.UI;
using System.Web.UI.WebControls;
public class BasePage : Page
{
protected Label eMail;
protected Label siteName;
virtual protected void PageLoadEvent(object sender, System.EventArgs e)
{}
protected void Page_Load(object sender, System.EventArgs e)
{
if(!IsPostBack)
{
string name = Context.User.Identity.Name;
eMail.Text = DatabaseGateway.RetrieveAddress(name);
siteName.Text = "Micro-site";
PageLoadEvent(sender, e);
}
}
#region Web Form Designer generated code
override protected void OnInit(EventArgs e)
{
//
//
// CODEGEN: 此调用是 ASP.NET Web 窗体设计器所必需的。
//
InitializeComponent();
base.OnInit(e);
}
/// <summary>
/// 设计器支持所必需的方法 - 不要使用代码编辑器修改
/// 此方法的内容。
/// </summary>
private void InitializeComponent()
{
this.Load += new System.EventHandler(this.Page_Load);
}
#endregion
}
BasePage.inc
您不仅必须为页面后面的逻辑代码提供公用基类,而且还必须提供用来保存视图或 UI 的呈现代码的公用文件。该代码包括在每个 .aspx 页面中。此 HTML 文件不是为了用于进行独立显示。通过使用公用文件,您可以在一个地方进行更改,并将这些
}
}
此代码的用途是通知页面控制器:当用户单击按钮后,将向服务器发送一个请求,并执行 SubmitBtn_Click 函数。
此实现显示了连接到控制器所提供的事件是多么简单。它还说明,用这种方式编写的代码更易于理解,因为应用程序逻辑没有与管理事件调度的低级代码结合起来。
公用外观示例
下面的示例使用页面控制器的典型实现策略来提供显示动态内容的横幅,该横幅在应用程序的每一页上显示已验证的用户的电子邮件地址(该地址是从数据库检索的)。
站点内的所有页面对象所继承的基类中包含了公用实现。图 3 显示了站点中的一个网页。
图 3: 显示动态内容的横幅
站点中的各个页面负责呈现自己的内容,而基类则负责呈现头信息。因为各个页面是从基类继承的,所以它们都具有相同的功能。
此实现使用了称为 Template Method的设计模式。该模式在一个操作中定义了一个算法的框架,而将一些步骤交给子类完成。Template Method 允许子类重新定义算法的某些步骤,而不必更改该算法的结构。 [Gamma95]
将 Template Method 应用于此问题需要将公用代码从各个页面移到一个基类中。这样可以确保公用代码放在一个地方,并且很容易维护。在此示例中,基类名为 BasePage 并负责将 Page_Load 方法连接到 Load 事件。与 BasePage 相关的工作(即从数据库检索用户的电子邮件地址和设置站点名)完成后,Page_Load 函数将调用名为 PageLoadEvent 的方法。子类实现 PageLoadEvent,以执行它们自己的特定 Load 功能。图 4 显示了此解决方案的结构。
图 4: 代码隐藏页面实现的结构
请求网页时,ASP.NET 运行库会触发 Load 事件,该事件再调用 BasePage 的 Page_Load 方法。BasePage 方法检索所需数据,然后对所请求的特定页面调用 PageLoadEvent,以执行任何与页面相关的所需加载。图 5 显示了页面请求序列。
图 5: 页面请求序列
通过以这种方式实现公用功能,页面不必设置头信息,并且还可以很容易地进行整个站点的更改。如果头信息呈现和初始化代码不包含在一个文件中,则必须对包含与头信息有关的代码的所有文件进行更改。
BasePage.cs
基类代码实现了以下功能:
将 Load 事件连接到 Page_Load 方法,以便进行与请求具体相关的初始化。
从请求上下文检索已验证的用户的名字,并使用 DatabaseGateway 类在数据库中查找该用户的记录。该代码将 eMail 标签分配给用户的电子邮件地址。
将站点名分配给 siteName 标签。
调用 PageLoadEvent 方法,可以由派生类实现该方法以进行任何与页面相关的加载。
注意:最好将 BasePage 类定义为抽象类,因为这样可以强制实现者提供 PageLoadEvent 的实现。不过,在 Microsoft Visual Studio® .NET 中,不可能将此基类定义为抽象类。相反,该类提供可由派生类覆盖的默认实现。
using System;
using System.Web.UI;
using System.Web.UI.WebControls;
public class BasePage : Page
{
protected Label eMail;
protected Label siteName;
virtual protected void PageLoadEvent(object sender, System.EventArgs e)
{}
protected void Page_Load(object sender, System.EventArgs e)
{
if(!IsPostBack)
{
string name = Context.User.Identity.Name;
eMail.Text = DatabaseGateway.RetrieveAddress(name);
siteName.Text = "Micro-site";
PageLoadEvent(sender, e);
}
}
#region Web Form Designer generated code
override protected void OnInit(EventArgs e)
{
//
//
// CODEGEN: 此调用是 ASP.NET Web 窗体设计器所必需的。
//
InitializeComponent();
base.OnInit(e);
}
/// <summary>
/// 设计器支持所必需的方法 - 不要使用代码编辑器修改
/// 此方法的内容。
/// </summary>
private void InitializeComponent()
{
this.Load += new System.EventHandler(this.Page_Load);
}
#endregion
}
BasePage.inc
您不仅必须为页面后面的逻辑代码提供公用基类,而且还必须提供用来保存视图或 UI 的呈现代码的公用文件。该代码包括在每个 .aspx 页面中。此 HTML 文件不是为了用于进行独立显示。通过使用公用文件,您可以在一个地方进行更改,并将这些
| 对此文章发表了评论 |

