母版页的强类型引用:@MasterType指令 - Qzone日志

来源:百度文库 编辑:神马文学网 时间:2024/04/26 19:24:18

需要考虑的第二个事项:@MasterType指令

以前,如果使用@MasterType指令来创建对母版页的强类型引用,那么在以编程方式设置母版页引用时就会出现问题。为了说明这一点,可以在@Page指令中将内容页面改为引用原始母版页 (MasterPage.master),然后添加@MasterType指令,并将VirtualPath属性设置为相同的母版页,如下所示。

  1. <%@ Page MasterPageFile="~/MasterPage.master" Language="C#" AutoEventWireup="true" 
  2. CodeFile="Default.aspx.cs" Inherits="_Default" Title="Untitled Page" %> 
  3. <%@ MasterType VirtualPath="~/MasterPage.master" %> 

回到内容页面的后台编码中,修改PreInit( )和Load( )事件,如下所示。

  1. protected void Page_PreInit(object sender, EventArgs e)  
  2. {  
  3. //Page.MasterPageFile = "~/MasterPage.master";  
  4. }  
  5.  
  6. protected void Page_Load(object sender, EventArgs e)  
  7. {  
  8. mpLabel.Text = Master.myValue;  

在这些改动中,只是将代码改为7.7.1节修改之前的形式。如果运行它,就会发现呈现的页面没有错误,内容区域的标签现在是"My Master Page String Value",在母版页中设置该标签。

现在继续分解这段代码。

修改PreInit( )事件,如下所示。

  1. protected void Page_PreInit(object sender, EventArgs e)  
  2. {  
  3. Page.MasterPageFile = "~/MasterPage2.master";  

现在重新运行应用程序。情况不是太好。开始呈现页面时就会出现如图7-26所示的错误。

  (点击查看大图)图7-26

如果忽略该错误并继续,在浏览器中就会得到如图7-27所示的错误。

记得前面设置@MasterType指令的属性的相关知识吗?只有两个属性--VirtualPath和TypeName,它们相互排斥。现在,设置这种引用的方法就是产生当前问题的原因。要坚持使用母版页的强类型,在@MasterType指令中执行的引用就必须应用于最终以编程方式设置的所有母版页。不能以编程方式设置@MasterType指令的属性,这样做会让事情变得更复杂。

如果将@MasterType指令设置为引用MasterPage.master,当突然将MasterPage2.master作为母版页时,应用程序就不知道如何处理它。因为无法在运行时切换母版页,所以就出现了问题。

处理这个问题的最佳方法是改变引用的方式。需要做的是建立派生所有母版页的基类,然后将@MasterType指令中的TypeName属性设置为该类(相对于在VirtualPath属性中硬编码母版页文件)。

 

  (点击查看大图)图7-27 因此,第一步是创建整个项目都要使用的基类,这个类需要继承System.Web.UI.MasterPage class。为了完成该操作,可以进入Visual Studio中的工具栏,选择Website | Add New Item命令,打开Add New Item屏幕。选择Class选项,选择偏好的语言,将文件命名为MasterBase.cs或者MasterBase.vb (取决于语言)。单击OK按钮时,可能提示建立App_Code文件夹(如果没有的话)。单击Yes按钮,添加文件夹,将新的基类放入这个新文件夹。默认代码如下所示。

  1. using System;  
  2. using System.Data;  
  3. using System.Configuration;  
  4. using System.Web;  
  5. using System.Web.Security;  
  6. using System.Web.UI;  
  7. using System.Web.UI.WebControls;  
  8. using System.Web.UI.WebControls.WebParts;  
  9. using System.Web.UI.HtmlControls;  
  10. ///  
  11. /// Summary description for MasterBase  
  12. /// 
  13.  
  14. public class MasterBase  
  15. {  
  16. public MasterBase()  
  17. {  
  18. //  
  19. // TODO: Add constructor logic here  
  20. //  
  21. }  

需要更改公有类声明,让其继承MasterPage类。还要将公有字符串变量myValue从MasterPage.master移动到新的基类。类代码块应该如下所示。

  1. public class MasterBase : System.Web.UI.MasterPage  
  2. {  
  3. public string myValue  
  4. {  
  5. get { return "My Master Page String Value"; }  
  6. set { }  
  7. }  

下面有一个公有字符串变量,它是刚刚创建的MasterBase类的一部分。现在要让页面符合这个新的基类。

需要修改当前拥有的两个母版页,以便它们在各自后台编码的文件中有类似的类声明。

  1. public partial class MasterPage : MasterBase 

当然,这是MasterPage.master后台编码中的代码。这段代码告诉部分类,它应该继承新建的MasterBase类。如果使用后台编码模式(而不是内联地编写代码块),请确保没有改变@Master指令的Inherits属性。当主文件有后台编码部分时,Inherits属性必须指向作为后台编码文件的类。这就是在该级别而不是在母版页本身继承新基类的原因。然而,如果没有后台编码文件,并且内联编码,那么就应该为基类改变(或者添加)Inherits属性,如下所示。

  1. <%@ Master Language="C#" Inherits="MasterBase" %> 

应该对项目中的所有母版页(此时,应该只包括MasterPage2.master)重复这种改动。

现在要修改内容页面Default.aspx,让它指向新的基类和@MasterType指令的一部分,如下所示。

  1. <%@ MasterType TypeName="MasterBase" %> 

现在要测试一切是否正常运行,可以在Default.aspx的后台编码中添加或者更新PreInit事件,如下所示。

  1. protected void Page_PreInit(object sender, EventArgs e)  
  2. {  
  3. Page.MasterPageFile = "~/MasterPage.master";  

现在运行应用程序,结果如图7-28所示。

  (点击查看大图)图7-28 现在回到Default.aspx,将PreInit事件更改为使用MasterPage2.aspx,如下所示。

  1. protected void Page_PreInit(object sender, EventArgs e)  
  2. {  
  3. Page.MasterPageFile = "~/MasterPage2.master";  

现在重新运行应用程序,结果如图7-29所示。

关于这个选项值得注意的是,当使用MasterPage2时标签被一致地设置。以前,当使用MasterPage.master时,通过来自母版页的文本填充标签。这是因为在该页面中只设置公有字符串变量。但是现在,因为在基类中设置公有字符串变量,并且两个母版页都继承这个基类,所以两个母版页都在标签中生成文本。

还会注意到,不需要改变任何代码来在内容页面中设置标签。

  1. protected void Page_Load(object sender, EventArgs e)  
  2. {  
  3. mpLabel.Text = Master.myValue;  

对母版页内容的引用仍然是强类型,这就意味着使用"Master"就可以访问其方法和属性。该引用持续使用基类(而不是单个母版页文件),即使在不同的母版页之间来回切换也是如此。

  (点击查看大图)图7-29

提示:

这一节在一定程度上简要概述了基类化,在面向对象编程中这是一种常见的实践操作,通过其建立在后面可以扩展到对象的额外抽象层。

本文来自《ASP.NET Web界面设计三剑客:CSS、Themes和Master Pages》张云 译:http://book.51cto.com/art/200906/132128.htm