技术开发 频道

在asp.net 2.0中使用母版页和工厂方法模式

母版页
我们看看当用户请求两个内容页之一——订单详情页时,将会发生什么。当我们用母版页工作时,事件的执行顺序很重要。内容页的Page load事件在母版页Page load事件之前发生,而母版页的page init事件在内容页的page init之前触发。这个顺序非常重要,我们将在后面讨论。目前,我们仅仅需要知道这些事件执行的顺序
  ·Master – initialize. 
  ·Content- initialize. 
  ·Content- load. 
  ·Master – load. 
  ·Content- render. 
  ·Master- render.

我们挨个事件观察母版页后面的代码

首先,我们实例化一个工厂类对象,同时申明一个类型是Base的对象。我们注意到母版页代码中有好几个事件。这些事件用于通知内容页,当母版页中的选择改变时,内容页也必须做相应变化。我不想就自定义事件和委托做过多讲解,因为有很多这方面的资料可得。我们还定义了几个公共属性。
private Factory Factory = newFactory(); private Base currentObject; public event GridSelectionChanged GridChanged; public event SecondryGridSelectionChanged ChildGridChanged; public string mainTitle { set { pageTitle.Text = value; } } public Base myObject { get { return currentObject; } }
在page init事件中,我们要求工厂得到合适的Base类型对象,属性myObject返回这个新创建的对象。这个属性在内容页使用,用于在Page Load事件中得到当前具体对象。还记得我们说过的事件的执行顺序吧。在page_init事件中,我们调用factory类getObject方法。如果我们把代码替换到page load事件中,我们就不能内容页得到它的引用,因为,内容页的page load事件在母版页的page load事件之前发生。
protected void Page_Init(object sender, System.EventArgs e) { if (Session["PageName"] != null) { if (Session["PageName"].ToString() != "Home") { currentObject = Factory.GetObject(Session[ "PageName"].ToString()); } } }
在母版页的page load事件中,我们请求Base类型对象currentObject绑定父表格。相似的,在父表格SelectedIndexChanged事件中,我们请求currentObject绑定子表格。在GV_TitleCompany_SelectedIndexChanged事件中,我们通知当前页,一个grid selection动作发生了。我们扩展了eventArg类,以处理事件消息——即表格的Datakey
protected void Page_Load(object sender, EventArgs e) { if (!Page.IsPostBack) { if (Session["PageName"] != null) { if (Session["PageName"].ToString() != "Home") { currentObject.BindParentGrid( GV_TitleCompany); } else { myPanel.Visible = false; Panel1.Visible = false; ClearGrid(); } } else { myPanel.Visible = false; Panel1.Visible = false; ClearGrid(); } } } protected void GV_TitleCompany_SelectedIndexChanged( object sender, EventArgs e) { GridViewRow row = GV_TitleCompany.SelectedRow; currentObject.BindChildGrid(GV_BranchName, GV_TitleCompany.DataKeys[GV_TitleCompany .SelectedIndex][0].ToString().Trim()); MasterGridEventArgument eventArgs = new MasterGridEventArgument(GV_TitleCompany.DataKeys[ GV_TitleCompany.SelectedIndex].Value.ToString() .Trim()); if (GridChanged != null) { GridChanged(this, eventArgs); } }
现在,我们来看看其中的一个内容页

订单页面
public partial class Pages_Default : System.Web.UI.Page { privateBase Orders; protectedvoid Page_Load(object sender, EventArgs e) { Pages_MasterGrid myMaster = (Pages_MasterGrid)this.Master; myMaster.mainTitle = "Order Information"; Orders = myMaster.myObject; } protected void Page_Init(object sender, System.EventArgs e) { Pages_MasterGrid myMaster = (Pages_MasterGrid)this.Master; myMaster.GridChanged += FillControls; myMaster.ChildGridChanged += FillChildInfo; } protected void FillControls(object sender, MasterGridEventArgument e) { // Code } protected void FillChildInfo (object sender, DetailGridEventArgument e) { // Code } }
在page_init事件中,我们增加自定义事件的处理逻辑,这些自定义事件将由母版页的父表格和子表格调用,然后在page load事件中,我们通过公共属性给Page Title赋值,我们也设置母版页的currentObject。我们给GridChanged事件添加了FillControl函数,以及给ChildGridChanged事件添加了FillChildInfo函数,这些函数将填充Multiview控件中所包括的控件。全部代码请参见源码


结语
这就是所有的内容,我们已经完成了母版页和工厂模式。欢迎大家对此文做出修改和评论。谢谢!
0
相关文章