母版页和导航
母版页
母版页提供了共享的HTML,控件和代码,他们可以作为一个模板,供网站内所有页面使用,任何母版页中的内容都会在使用该母版页的页面中显示
添加新项,选择“母版页”,添加一个母版页
在新建的母版页中,已经包含asp:contentplaceholder声明:
<asp:contentplaceholder id="ContentPlaceHolder1" runat="server">
</asp:contentplaceholder>
在contentplaceholder控件中,可以在该控件周围添加任何内容
添加内容页
使用母版页的页面的所有内容,将被放在母版页的contentplaceholder控件的位置
一个母版页可以有多个contentplaceholder控件
可以在添加web窗体的时候选择“选择母版页”,就可以为子页面选择一个母版页
或者在page指令中添加MasterPageFile属性,值为母版页路径
子页面包含一个page指令,但没有html,form,head,body标签,所有子控件内容都显示在相关母版页的contentplaceholder控件的所在区域
例如:
<%@ Page Language="C#" MasterPageFile="~/MasterPage.master" AutoEventWireup="true" CodeFile="Default.aspx.cs" Inherits="Default" Title="Untitled Page" %>
<asp:Content ID="Content1" ContentPlaceHolderID="content1" Runat="Server">
</asp:Content>
子页面的设计视图中将看到母版页的内容,但不能修改,只能在content控件中添加内容
例如:
<asp:Content ID="Content1" ContentPlaceHolderID="content1" Runat="Server">
<asp:Label ID="Label1" runat="server" Text="show something"></asp:Label>
</asp:Content>
其中ContentPlaceHolderID用于获取或设置与当前内容关联的ContentPlaceHolder控件的ID
使用嵌套母版页
任何网页都可以与嵌套母版页或者原始母版页组合
添加一个新的母版页,把原来的内容删掉,并作如下修改:
<%@ Master Language="C#" MasterPageFile="~/MasterPage.master" AutoEventWireup="true"
CodeFile="MasterPage2.master.cs" Inherits="ASP.NET" %>
<asp:Content runat="server" ID="MasterContent" ContentPlaceHolderID="content1">
<div>
<asp:ContentPlaceHolder ID="content2" runat="server">
</asp:ContentPlaceHolder>
</div>
</asp:Content>
它把之前的MasterPage.master作为母版页,并在Content控件中添加自己的ContentPlaceHolder控件
但子页面使用嵌套母版页时不能使用设计视图
动态编辑母版页
动态编辑母版页就是通过子页面改变母版页的显示内容
可以在母版页中创建公共属性来实现
例如:
在MasterPage.master.cs中添加一个公共属性
public string Lable
{
set { this.Label1.Text = value; }
}
对应MasterPage.master中的Lable1
<asp:Label ID="Label1" runat="server" Text="Label"></asp:Label>
在子页面中添加MasterType指令用于创建对母版页的引用
<%@ MasterType TypeName="MasterPage" %>
之后就可以在代码文件中修改母版页的内容
protected void Page_Load(object sender, EventArgs e)
{
this.Master.Lable = "show something";
}
还有一种使用这个属性的方法是采用后期绑定,但相对较慢
例如:
protected void Page_Load(object sender, EventArgs e)
{
Label lb = Master.FindControl("Lable1") as Label;
lb.Text = "show something";
}
导航
从站点导航开始
新建一个“站点地图”,是一个.sitemap文件
同时站点地图的框架已经搭建好了
例如:
<?xml version="1.0" encoding="utf-8" ?>
<siteMap xmlns="http://schemas.microsoft.com/AspNet/SiteMap-File-1.0" >
<siteMapNode url="" title="" description="">
<siteMapNode url="" title="" description="" />
<siteMapNode url="" title="" description="" />
</siteMapNode>
</siteMap>
title属性定义了链接所要使用的文本
description属性用于定义工具提示
例如:
<?xml version="1.0" encoding="utf-8" ?>
<siteMap xmlns="http://schemas.microsoft.com/AspNet/SiteMap-File-1.0" >
<siteMapNode title="Programming" description="Contract Programming" url="~/Programming.aspx">
<siteMapNode title="On-Site" description="On-site" url="~/OnSite.aspx" />
<siteMapNode title="Off-Site" description="Off-site" url="~/OffSite.aspx" />
</siteMapNode>
</siteMap>
站点地图文件包括一个单独的<siteMap>元素,用来定义命名空间:
<siteMap xmlns="http://schemas.microsoft.com/AspNet/SiteMap-File-1.0" >
在siteMap元素中只能嵌套一个<siteMapNode>元素,而<siteMapNode>元素中可以嵌套多个<siteMapNode>元素
建立页面
为了使用站点地图,必须先创建一个母版页
并将一个SiteMapDataSource控件放到母版页中
注意:添加到母版页的控件必须置于ContentPlaceHolder控件外,form标签之内
默认情况下,SiteMapDataSource控件将搜索并使用Web.sitemap文件
构建一个健全的导航,须创建网站地图和面包屑
插入一个TreeView控件
点击智能标签,在“选择数据源”中选择刚创建的SiteMapDataSource控件数据源
它将成为一个树形导航控件
插入一个SiteMapPath控件
它将自动生成面包屑,即链接导航
注意:
TreeView控件的节点可以折叠或展开
面包屑通过SiteMapPath控件实现,它将显示如何到达当前页,如何回到首页
定制外观和操作
TreeView控件可以使用“自动套用格式”设置样式
或者通过设置控件属性设置节点样式
TreeView控件方法
方法 说明
CollapseAll 折叠所有树节点
ExpandAll 展开所有树节点
FindNode 检索指定值路径处的TreeNode对象
TreeView控件事件
事件 说明
SelectedNodeChanged 当节点被选中时发生
TreeNodeCheckChanged 当节点的多选框状态被修改时发生
TreeNodeCollapsed 当节点被折叠时发生
TreeNodeExpanded 当节点被展开时发生
TreeNodePopulate 当PopulateOnDemand属性为true的节点展开时发生
SiteMapPath控件也可以使用“自动套用格式”设置样式
或者通过设置控件属性设置节点样式
通过“编辑模板”可以设置NodeTemplate,CurrentNodeTemplate,RootNodeTemplate,PathSeparatorTemplate的样式
其中PathSeparator属性可用于设置用于分隔菜单项路径的字符
ParentLevelsDisplayed属性可用来显示显示节点层数
按需呈现
可以让TreeView按需呈现,即不是一次加载所有节点,而是按需加载显示
首先修改TreeView的标签为非自封闭标签,并添加ExpandDepth属性
ExpandDepth属性获取或设置第一次显示TreeView控件时所展开的层次数
再给TreeView控件添加DataBindings元素,并在该元素中添加TreeNodeBinding控件,并设置DataMember属性来应用树节点绑定的值
例如:
<asp:TreeView ID="TreeView1" runat="server" DataSourceID="SiteMapDataSource1" ExpandDepth="0">
<DataBindings><asp:TreeNodeBinding DataMember="SiteMapNode" /></DataBindings>
</asp:TreeView>
使用菜单导航
可以使用Menu控件代替TreeView控件
添加一个Menu控件,设置DataSourceID属性为SiteMapDataSource控件的id
例如:
<asp:Menu ID="Menu1" runat="server" DataSourceID="SiteMapDataSource1">
</asp:Menu>
可以使用Orientation属性设置Menu控件的呈现方向,默认为Vertical
以编程方式遍历站点地图的节点
通过代码可以遍历站点地图的节点
例如:
this.Label1.Text = SiteMap.CurrentNode.Title;
if (SiteMap.CurrentNode.HasChildNodes)
{
foreach (SiteMapNode childNode in SiteMap.CurrentNode.ChildNodes)
{
this.Label2.Text += childNode.Title + "<br/>";
}
}
其中SiteMap用来呈现网站导航结构,SiteMap对象由站点地图提供程序创建
CurrentNode返回一个SiteMapNode类型的对象,其Title属性返回其标题
HasChildNodes属性返回一个布尔值,表示该节点是否有子节点
并通过ChildNodes属性返回的SiteMapNodeCollection对象遍历子节点
基于安全的过滤
启用成员资格
添加角色
添加登录页面
创建访问规则
创建权限驱动的站点地图