使用视图母版页创建页面布局 (VB)
本教程介绍如何利用视图母版页,在应用程序中为多个页面创建通用页面布局。 例如,可以使用视图母版页来定义两列页面布局,并将双列布局用于 Web 应用程序中的所有页面。
使用视图母版页创建页面布局
本教程介绍如何利用视图母版页,在应用程序中为多个页面创建通用页面布局。 例如,可以使用视图母版页来定义两列页面布局,并将双列布局用于 Web 应用程序中的所有页面。
还可以利用视图母版页在应用程序中的多个页面之间共享公共内容。 例如,可以在视图母版页中放置网站徽标、导航链接和横幅广告。 这样,应用程序中的每个页面都会自动显示此内容。
本教程介绍如何创建新的视图母版页,以及如何基于母版页创建新的视图内容页。
创建视图母版页
让我们首先创建一个定义两列布局的视图母版页。 通过右键单击 Views\Shared 文件夹,选择菜单选项 “添加”、“新建项”,然后选择“MVC 视图母版页”模板 (请参阅图 1) ,将新的视图母版页添加到 MVC 项目。
图 01:添加视图母版页 (单击以查看全尺寸图像)
可以在应用程序中创建多个视图母版页。 每个视图母版页都可以定义不同的页面布局。 例如,您可能希望某些页面具有两列布局,而其他页面具有三列布局。
视图母版页看起来非常类似于标准 ASP.NET MVC 视图。 但是,与普通视图不同,视图母版页包含一个或多个 <asp:ContentPlaceHolder>
标记。 标记 <contentplaceholder>
用于标记可在单个内容页中重写的母版页区域。
例如,列表 1 中的视图母版页定义两列布局。 它包含两个 <contentplaceholder>
标记。 每列一个 <ContentPlaceHolder>
。
清单 1 - Views\Shared\Site.master
<%@ Master Language="VB" AutoEventWireup="false" CodeBehind="Site.Master.vb" Inherits="MvcApplication1.Site" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" >
<head id="Head1" runat="server">
<title></title>
<style type="text/css">
html
{
background-color:gray;
}
.column
{
float:left;
width:300px;
border:solid 1px black;
margin-right:10px;
padding:5px;
background-color:white;
min-height:500px;
}
</style>
<asp:ContentPlaceHolder ID="head" runat="server">
</asp:ContentPlaceHolder>
</head>
<body>
<h1>My Website</h1>
<div class="column">
<asp:ContentPlaceHolder ID="ContentPlaceHolder1" runat="server">
</asp:ContentPlaceHolder>
</div>
<div class="column">
<asp:ContentPlaceHolder ID="ContentPlaceHolder2" runat="server">
</asp:ContentPlaceHolder>
</div>
</body>
</html>
清单 1 中视图母版页的正文包含两个对应于这两 <div>
列的标记。 级联样式表列类应用于这两个 <div>
标记。 此类在母版页顶部声明的样式表中定义。 可以通过切换到设计视图来预览视图母版页的呈现方式。 单击源代码编辑器左下角的“设计”选项卡 (请参阅图 2) 。
图 02:在设计器中预览母版页 (单击以查看全尺寸图像)
创建“查看内容”页
创建视图母版页后,可以基于视图母版页创建一个或多个视图内容页。 例如,可以通过以下方式为主控制器创建索引视图内容页:右键单击 Views\Home 文件夹,选择 “添加”、“新建项”,选择 “MVC 视图内容页 ”模板,输入名称 Index.aspx,然后单击“添加”按钮 (查看图 3) 。
图 03:添加视图内容页 (单击以查看全尺寸图像)
单击“添加”按钮后,将显示一个新对话框,可用于选择要与视图内容页关联的视图母版页 (请参阅图 4) 。 可以导航到我们在上一部分创建的 Site.master 视图母版页。
图 04:选择母版页 (单击以查看全尺寸图像)
基于 Site.master 母版页创建新的视图内容页后,将获取列表 2 中的 文件。
清单 2 - Views\Home\Index.aspx
<%@ Page Title="" Language="VB" MasterPageFile="~/Views/Shared/Site.Master" AutoEventWireup="false" CodeBehind="Index.aspx.vb" Inherits="MvcApplication1.Index" %>
<asp:Content ID="Content1" ContentPlaceHolderID="head" runat="server">
</asp:Content>
<asp:Content ID="Content2" ContentPlaceHolderID="ContentPlaceHolder1" runat="server">
</asp:Content>
<asp:Content ID="Content3" ContentPlaceHolderID="ContentPlaceHolder2" runat="server">
</asp:Content>
请注意,此视图包含对应于 <asp:Content>
视图母版页中的每个 <asp:ContentPlaceHolder>
标记的标记。 每个标记都包含 <asp:Content>
一个 ContentPlaceHolderID 属性,该属性指向它所替代的特定 <asp:ContentPlaceHolder>
。
此外,请注意,清单 2 中的内容视图页面不包含任何正常的开始和结束 HTML 标记。 例如,它不包含开始和结束 <html>
或 <head>
标记。 所有普通的开始和结束标记都包含在视图母版页中。
要在视图内容页中显示的任何内容都必须放置在 标记中 <asp:Content>
。 如果在这些标记之外放置任何 HTML 或其他内容,则在尝试查看页面时将收到错误。
无需覆盖内容视图页中母版页中的每个 <asp:ContentPlaceHolder>
标记。 仅当希望将标记替换为特定内容时,才需要重写 <asp:ContentPlaceHolder>
标记。
例如,列表 3 中修改后的索引视图仅包含两个 <asp:Content>
标记。 <asp:Content>
每个标记都包含一些文本。
清单 3 – Views\Home\Index.aspx (modified)
<%@ Page Title="" Language="VB" MasterPageFile="~/Views/Shared/Site.Master" AutoEventWireup="false" CodeBehind="Index.aspx.vb" Inherits="MvcApplication1.Index" %>
<asp:Content ID="Content2" ContentPlaceHolderID="ContentPlaceHolder1" runat="server">
<h1>Content in first column!</h1>
</asp:Content>
<asp:Content ID="Content3" ContentPlaceHolderID="ContentPlaceHolder2" runat="server">
<h1>Content in second column!</h1>
</asp:Content>
当请求清单 3 中的视图时,它将呈现图 5 中的页面。 请注意,视图呈现具有两列的页面。 此外,请注意,视图内容页中的内容与视图母版页中的内容合并。
图 05:“索引视图内容”页 (单击以查看全尺寸图像)
修改视图母版页内容
使用视图母版页时几乎立即遇到的一个问题是,在请求不同的视图内容页时修改视图母版页内容的问题。 例如,你希望 Web 应用程序中的每个页面都有唯一的标题。 但是,标题在视图母版页中声明,而不是在视图内容页中声明。 那么,如何自定义每个视图内容页面的页面标题?
有两种方法可以修改视图内容页面显示的标题。 首先,可以将页面标题分配给在视图内容页面顶部声明的 指令的 title 属性 <%@ page %>
。 例如,如果要将页面标题“超级优秀网站”分配给索引视图,则可以在索引视图顶部包含以下指令:
<%@ page title="Super Great Website" language="VB" masterpagefile="~/Views/Shared/Site.Master"
autoeventwireup="true" codebehind="Index.aspx.vb" inherits="MvcApplication1.Views.Home.Index"%>
当索引视图呈现到浏览器时,所需的标题将显示在浏览器标题栏中:
母版视图页必须满足一个重要要求才能使标题属性正常工作。 视图母版页的标头必须包含 <head runat="server">
标记,而不是普通 <head>
标记。 <head>
如果标记不包含 runat=“server” 属性,则不会显示标题。 默认视图母版页包含所需的 <head runat="server">
标记。
从单个视图内容页修改母版页内容的替代方法是将要修改的区域包装在标记中 <asp:ContentPlaceHolder>
。 例如,假设你不仅要更改标题,还要更改由母版视图页面呈现的元标记。 清单 4 中的母版视图页在其 <head>
标记中包含一个<asp:ContentPlaceHolder>
标记。
清单 4 - Views\Shared\Site2.master
<%@ Master Language="VB" AutoEventWireup="false" CodeBehind="Site2.Master.vb" Inherits="MvcApplication1.Site2" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" >
<head>
<asp:ContentPlaceHolder ID="head" runat="server">
<title>Please change my title</title>
<meta name="description" content="Please provide a description" />
<meta name="keywords" content="keyword1,keyword2" />
</asp:ContentPlaceHolder>
</head>
<body>
<div>
<asp:ContentPlaceHolder ID="ContentPlaceHolder1" runat="server">
</asp:ContentPlaceHolder>
</div>
</body>
</html>
请注意, <asp:ContentPlaceHolder>
清单 4 中的标记包含默认内容:默认标题和默认元标记。 如果未在单个视图内容页中重写此 <asp:ContentPlaceHolder>
标记,则将显示默认内容。
列表 5 中的内容视图页面将覆盖 <asp:ContentPlaceHolder>
标记,以显示自定义标题和自定义元标记。
清单 5 – Views\Home\Index2.aspx
<%@ Page Title="" Language="VB" MasterPageFile="~/Views/Shared/Site2.Master" AutoEventWireup="false" CodeBehind="Index2.aspx.vb" Inherits="MvcApplication1.Index2" %>
<asp:Content ID="Content1" ContentPlaceHolderID="head" runat="server">
<title>The Index2 Page</title>
<meta name="description" content="Description of Index2 page" />
<meta name="keywords" content="asp.net,mvc,cool,groovy" />
</asp:Content>
<asp:Content ID="Content2" ContentPlaceHolderID="ContentPlaceHolder1" runat="server">
Just some content in the body of the page.
</asp:Content>
总结
本教程提供了查看母版页和查看内容页的基本简介。 你了解了如何创建新的视图母版页并基于它们创建视图内容页。 我们还检查了如何从特定视图内容页修改视图母版页的内容。