ASP.NET界面设计(二)之使用母版页《ASP.NET2.0网站开发全程解析》

news/2024/5/10 1:57:20/文章来源:https://blog.csdn.net/weixin_30902251/article/details/97552940

ASP.NET 2.0引入了一个新的功能,称为模板页面(Master Page),利用这一功能可以为每个页面定义能共享的通用区域,像页头、页脚、菜单等。模板页面能够把通用的布局代码放到一个单独的文件中,然后使其他内 容页面在外观上继承于它。一个模板页面就可以包含网站的总体布局。内容页面能从模板页面继承外观,并且把它们自己的内容放到模板页面定义的一个 ContentPlaceHolder控件中。其实,这只具有了外观继承的效果,并未真正实现OOP意义上的继承,实际上模板页面的实现基于模板模型。

模板页面的扩展名为.master,类似于用户控件。下面是一个新建模板页面的代码。 注意新建母版页中含有form元素,如果内容页面也含有表单,会发生错误。可以将母版页中的form元素删去。 

<%@ Master Language="C#" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<script runat="server">
</script>

<html xmlns="http://www.w3.org/1999/xhtml" >
<head runat="server">
    
<title>无标题页</title>
</head>
<body>
    
<div>
        
<asp:contentplaceholder id="ContentPlaceHolder1" runat="server"></asp:contentplaceholder>
    
</div>
</body>
</html>

可以看出来,它与标准页面非常接近,除了在页面顶端,它使用的是一个@Master指令,而不是@Page指令。它可以申明一个或者多个 ContentPlaceHolder控件,.aspx文件可以在其中添加自己的内容。

我们在母版页中加入两幅图片作为 通用区域。

<%@ Master Language="C#" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<script runat="server">
</script>

<html xmlns="http://www.w3.org/1999/xhtml" >
<head runat="server">
    
<title>无标题页</title>
</head>
<body>
    
<img src="images/Bluehills.jpg" style="width: 660px; height: 175px" />        
    
<div>
        
<asp:contentplaceholder id="ContentPlaceHolder1" runat="server"></asp:contentplaceholder>
    
</div>
    
<img src="images/Bluehills.jpg" style="width: 660px; height: 175px" />
</body>
</html>

 

由于在模板页面中已经定义了<html>、<head>、<body> 和<form>标记,因此在内容页面中不能再重新定义它们。内容页面只需定义要在ContentPlaceHolder控件中显示的内容。下 面摘录了一个内容页面的例子:

<%@ Page Language="C#" AutoEventWireup="true"  CodeFile="Default.aspx.cs" Inherits="_Default" MasterPageFile="~/first.master" %>

<asp:Content ID="content1" ContentPlaceHolderID="ContentPlaceHolder1" runat=server>  
    
<form id="form1" runat="server">    
   
<asp:TextBox ID="TextBox1" runat="server"></asp:TextBox>
   
<asp:Button ID="Button1" runat="server" Text="Button" />
    
</form>    
</asp:Content>

第一个关键点是@Page指令,它设置MasterPageFile属性来指定所使用的模板页面的虚拟路径。内容放在Content 控件中,Content的ContentPlaceHolderID属性必须同模板页面中某个ContentPlaceHolder控件的ID保持一致。 在一个内容页面中,只能放置Content控件,其他用来实际进行显示的ASP控件必须组成一组放置在最外层的Content 控件中。另外要注意的是,@Page指令有一个新的属性Title,该属性允许覆盖掉模板页面中<title>元标记所给的值。如果没有在内 容页面中指定该属性,那么就用模板页面中指定的title来代替。

结果图:

 

下图给出了一个模板页面功能的图形说明。

 

当在Visual Studio中编辑一个内容页面时,它把模板页面和内容页面结合起来显示在表单设计器中,但是模板页面部分呈灰色显示。这样做的主要目的是为了提醒开发人员在编辑一个内容页面时不能修改模板页面中的内容。

要指出的是,模板页面也有一个后台代码文件,可以用于定义一些C#属性和函数,这些函数可以被.aspx或者是内容页面的后台代码文件访问。

当在一个模板页面中定义了ContentPlaceHolder后,也可以指定它的默认内容。在内容页面中没有为ContentPlaceHolder提供Content控件时,就可以使用它的默认值。

如果想为不同的一组内容页面设置不同的模板页面,页面上的MasterPageFile属性将会起到作用。但如果网站上的所有页面都使用同一个模板页面,则可以在web.config文件中通过<pages>元素直接来指定,如下所示:

<pages masterPageFile="~/Template.master" />

如果还在页面中指定了MasterPageFile属性的值,那么该值将会把web.config中所定义的值覆盖掉。

更进一步,可以把一个模板页面作为其他模板页面的内容。换言之,可以对模板页面进行嵌入,如下所示:

<%@ Master Language="C#"  MasterPageFile ="~/first.master"%>

<asp:Content ID="child" ContentPlaceHolderID="ContentPlaceHolder1" runat=server>
<img src="images/A2.jpg" style="width: 200px; height: 175px" />     //固定通用的
<div>
        
<asp:contentplaceholder id="ContentPlaceHolder2" runat="server"></asp:contentplaceholder>
</div>
</asp:Content>

可以使用一个外层的模板页面定义网站总体的基本布局(经常为公司级别的布局),然后使用其他的模板页面来指定网站上特定区域的布局,像在线商店、网站管理 等。内嵌模板页面唯一的不足就是不能在Visual Studio IDE中进行即时设计(就像设计第一层模板页面时那样进行设计)。在编辑内容页面时,必须在源代码编辑器中完成代码的每一个部分,只能通过浏览器来查看结 果。不过这对于开发人员来说不是什么大问题。

在内容页面中访问模板页面

也可以从内容页面通过其Master属性访问模板页面,返回的对象是MasterPage类型的,该类型直接从UserControl继承(记得曾 经提到过模板页面同用户控件很相似)并且增加了两个属性。它展示一个控件集合,允许内容页面对模板页面上的控件进行访问。这可能是必须的,例如,在某些页 面可能需要通过编程将模板页面中的一些控件隐藏,像登录框或者标语(banner)栏。直接访问控件集合就可以完成,但是需要将Control对象转换为 正确的控件类型,需要使用弱类型方法。有一个更好的且面向对象的方法:在模板页面的后台代码类中添加自定义属性--在本例中,将一些控件的Visible 属性封装。可以这样编写:

public bool LoginBoxIsVisible
{
get { return LoginBox.Visible; }
set { LoginBox.Visible = value; }
}
现在可以在内容页面中的@Page指令后添加下面一行代码:
<%@ MasterType VirtualPath="~/MasterPage.master" %>
这 行代码指定了模板页面的路径,ASP.NET在运行时通过该模板页面动态地创建一个强类型类MasterPage,其中包含了自定义属性。这像是 @Page指令中的MasterPageFile属性的一个副本,但正是它使得模板页面中的属性可以被内容页面调用。可以通过虚拟路径(如上例所示)来指 定MasterType,也可以通过模板页面的类名、TypeName属性来指定。一旦在内容页面的后台代码文件中添加了该指令(或者在内容页 面.aspx文件中的<script runat="server">中),就能以强类型化的方式轻松地对模板页面的LoginBoxIsVisible属性进行访问,如下所示:
protected void Test_OnClick(object sender, EventArgs e)
{
this.Master.LoginBoxIsVisible = false;
}

这里所说的"强类型化"指的是能够在该属性上使用Visual Studio的智能感知功能,当输入"this.Master."输入到第2个点的时候,就能够在智能感知下拉列表中看到新属性。

这种在内容页面中访问模板页面中对象的方式也适用于访问模板页面中的共用方法,所有的页面都可以用这种方式。如果自动输入无法访问ASP.NET在运行时创建的MasterPage对象,那么就需要通过反射来获得那些方法,但那样做速度会慢很多,使用起来不够敏捷。

对于阅读过本书第1版的读者,我想对使用OOP基页和模板页面做一个比较。在第1版中定义了一个名为ThePhile的基类,所有的内容页面都从该 基类继承。这是真实的OOP继承,但是使用起来是有限制的,因为无法继承基类中的任何外观,不得不创建一个用户控件来完成一般的视觉元素,然而在 ASP.NET 2.0中,定义一个模板页面,就可以得到完整的视觉外观继承(非OOP代码继承)。缺乏代码的继承并没有导致很多限制,因为可以通过一个 MasterType引用来访问模板页面中的代码。

4. 在运行时切换模板页面

在介绍模板页面的最后,要介绍一下内容页面在运行时动态切换模板页面的功能。可以有多个模板页面,在网站开始运行以后再挑选一个来用。可以在页面的PreInit事件处理程序中通过设置MasterPageFile属性来实现这个功能,如下所示:

protected void Page_PreInit(object sender, EventArgs e)
{
this.MasterPageFile = "~/OtherMasterPage.master";
}

PreInit事件是ASP.NET 2.0中的一个新事件,在这个事件处理程序中只能设置MasterPageFile属性。因为合并两个页面必须发生在页面生命周期的很早阶段(在Load和Init事件中就来不及了)。

当动态改变模板页面时,必须确保所有模板页面的ContentPlaceHolder控件都有相同的ID,这样无论使用哪个模板页面,内容页面的 Content控件都可以永远与它相匹配。可以构建很多个模板页面,每一个都指定了完全不同的布局,允许用户选择他们喜欢的一种。这种方法的缺点是如果在 模板页面的后台代码文件中编写了一些代码,那么需要把这些代码复制到每个页面的后台代码类中。否则,内容页面无法找到它们。另外,也无法使用强类型化的 Master属性,因为在运行时不能动态地改变模板页面的类型,只能在@MasterType 指令中设置它。由于这些原因,因此本书不准备通过使用多个模板页面来为用户提供不同的布局。而只使用一个模板页面,为它设置不同的样式表文件。因为我们已 经决定使用非表格结构的布局,所以可以通过为它应用不同的样式来改变页面的外观(字体、颜色、图片以及位置)。

 

转载于:https://www.cnblogs.com/heyutao/archive/2009/05/29/1491893.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.luyixian.cn/news_show_746697.aspx

如若内容造成侵权/违法违规/事实不符,请联系dt猫网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

UI应遵循的三大网站设计原则

转&#xff1a;http://www.csdn.net/article/2012-08-10/2808473 摘要&#xff1a;触摸优先设计、响应式设计、移动优先设计是UI设计师设计网站应遵循的三大原则&#xff0c;以使网站最大范围地适应各种设备。 触摸优先设计、响应式设计、移动优先设计是UI设计师设计网站应遵循…

构建ASP.NET网站十大必备工具

转&#xff1a;http://www.cnblogs.com/xuefeng1982/archive/2011/01/27/1946209.html 最近使用ASP.NET为公司构建了一个简单的公共网站&#xff08;该网站的地址&#xff1a;http://superexpert.com/&#xff09;。在这个过程中&#xff0c;我们使用了数量很多的免费工具&…

winform中linklabel打开指定网站

周末在家&#xff0c;正好有空写了个小程序&#xff0c;方便转换2进制、8进制和16进制&#xff0c;其中用了个linklabel控件&#xff0c;用来打开我自己的博客&#xff0c;想不到居然看书也没找到怎么才能用这个控件打开网页。按理说linklabel控件本身就是超链接&#xff0c;理…

毕业设计网站截图

注&#xff1a;网站标志是用Flash做的&#xff0c;网站首页那个粉红的圈是用代码实现的&#xff0c;可以绕圈的。 网站首页&#xff1a; 网站主页&#xff1a; 网站知识&#xff1a; 用户注册&#xff1a; 客户留言板 主要的就这么多了&#xff0c;其他的是些案例介绍的页面。 …

网站如何集成支付宝!原来要给钱的

转&#xff1a;http://gavin-chen.iteye.com/blog/257864 刚在Javaeye看到一篇文章&#xff0c;关于网站集成支付宝的&#xff0c;正是我之前想了解的&#xff0c;不过作者写得有些零乱&#xff0c;解释也不太清楚&#xff0c;代码格式更是看着郁闷&#xff0c;待以后有空消化…

分享25佳 iPad 应用程序的网站设计案例

苹果的东西太招人喜欢了&#xff0c;iPad 2在国内还未上市&#xff0c;江湖传闻有中国“黄牛”提编织袋在美国抢购 iPad 2&#xff0c;不知是真是假。不过我们今天不讨论这个&#xff0c;我们说点别的&#xff0c;有的人称iPad为平板电脑&#xff0c;有的人说不对&#xff0c;应…

为SharePoint网站创建自定义导航菜单

转&#xff1a;http://kaneboy.blog.51cto.com/1308893/397779 相信不少人都希望把SharePoint网站内置的那个顶部导航菜单&#xff0c;换成自己希望的样式。由于SharePoint 2007/2010的网站导航基本上基于标准的ASP.NET SiteMap模型&#xff0c;所以只要你对ASP.NET SiteMap有…

Sharepoint网站创建自定义导航全记录

转&#xff1a;http://tech.it168.com/a2009/1207/820/000000820524_all.shtml 【IT168 技术文档】在一个Sharepoint网站中可以创建子网站&#xff0c;页面&#xff0c;文档库等等&#xff0c;下面我们详细介绍创建页面导航和下拉菜单的过程。 1.要激活一个发布功能的Feature。…

在SharePoint 2010中创建网站的权限级别

转&#xff1a;http://www.360sps.com/Item/CreatePermissionLevels.aspx 权限级别是SharePoint 2010新增加的功能&#xff0c;使我们对权限的设置又提高了一个层次。SharePoint 2010的权限级别指的是可分配给用户或用户组的单个权限组。SharePoint 2010自带的权限级别有&…

深度学习相关网站链接与参考资料

http://deeplearning.stanford.edu/wiki/index.php/神经网络 https://arxiv.org/list/cs.AI/recent https://www.52ml.net/18635.html http://neuralnetworksanddeeplearning.com/ https://github.com/tigerneil/neural-networks-and-deep-learning-zh-cn http://www.hank…

21个为您的网站和博客提供的免费视频播放器

很多设计师在都会在他们的网站使用视频播放器。在线视频播放器无需为简单的用户和Web开发人员提供过多的介绍&#xff0c;它简单易用&#xff0c;为您建站时提供了灵活性和创造性&#xff0c;您可以添加无限数量的视频&#xff0c;并根据你的想法安排它们的专辑标题、艺术家的名…

网站重构之配置文件分解

转&#xff1a;http://www.cnblogs.com/ASPNET2008/archive/2010/05/04/1727538.html 最近赶上公司重构网站,架构组的同事为提高web部门的开发效率,总结出了一些不错的经验&#xff0c;本人也是直接受益者&#xff0c;为此用下面几篇文章来与大家分享。 这一篇&#xff0c;我想…

优秀网页设计:别出心裁的创意网站导航菜单

导航菜单是网站重要的组成部分&#xff0c;关系着网站的可用性和用户体验。一个有吸引力的导航能够吸引用户去浏览更多的网站内容&#xff0c;增加用户在网站的停留时间。为了让导航能够和网页内容完美的融合在一起&#xff0c;设计前需要设仔细分析网页结构。下面收集了30佳别…

互联网网站的反爬虫策略浅析

因为搜索引擎的流行&#xff0c;网络爬虫已经成了很普及网络技术&#xff0c;除了专门做搜索的Google&#xff0c;Yahoo&#xff0c;微软&#xff0c;百度以外&#xff0c;几乎每个大型门户网站都有自己的搜索引擎&#xff0c;大大小小叫得出来名字得就几十种&#xff0c;还有各…

这是一个神奇(神器)的网站

只要想不到&#xff0c;没有g友做不到 PaperWriting网站地址

大型网站动态应用系统架构(转)

原文在这里。 动态应用&#xff0c;是相对于网站静态内容而言&#xff0c;是指以c/c、php、Java、perl、.net等服务器端语言开发的网络应用软件&#xff0c;比如论坛、网络相册、交友、BLOG等常见应用。动态应用系统通常与数据库系统、缓存系统、分布式存储系统等密不可分。 大…

Python爬虫之网站验证码识别(三)

视频链接&#xff1a;Python爬虫7天速成&#xff08;2020全新合集&#xff09;无私分享 Python: 章节p29-p31 文章目录前言一、云打码平台使用流程操作流程二、代码编写⭐2.1 使用超级鹰云平台2.2 实战演练⭐总结前言 验证码和爬虫之间的爱恨情仇&#xff1f; 门户网站所提供的…

asp.net 1.1网站开发配置出现”Visual Studio .NET 无法创建或打开应用程序”解决方法...

可能的解决方案&#xff1a; 1.注册.net framework 1.1 C:\WINDOWS\Microsoft.NET\Framework\v1.1.4322\aspnet_regiis /i 2,如果配置的改网站端口以前曾经有其他网站占用过改端口&#xff0c;删除一下目录 C:\Documents and Settings\Administrator\VSWebCache\[计算机名]-[端…

IIS企业案例系列之四:发布多个网站之方案二

方案2&#xff1a;多端口发布网站到外网&#xff0c;默认发布不加密的网站是80端口&#xff0c;下面我们测试用81端口发布一个新的网站&#xff1a;www.iSusan.com,并绑定IP地址192.168.2.20&#xff0c;具体步骤如下&#xff1a;1、下面添加一个新的网站Susan在C盘Susan文件夹…